gpt4 book ai didi

c++ - 派生类错误 'no type named my_data in '

转载 作者:行者123 更新时间:2023-11-30 02:51:54 24 4
gpt4 key购买 nike

在我的代码中,我使用了一个模板化的多维容器类 array_dyn<T> ,它有一个属性 my_data那是一个std::vector<T> .

为了保持可分离性,我使用自己的类 bisArray<T>继承自 array_dyn :

typedef array_dyn<T>                   super_type;
typedef typename super_type::index_t index_t;

template < typename Sizes >
bisArray( dirs a_dir, Sizes const& a_sizes={} ):
super_type ( a_dir, a_sizes ), super_type::my_data( super_type::size()) {}
template < typename Sizes >
bisArray( Sizes const& a_sizes={} ):
super_type ( dir_fwd, a_sizes ), super_type::my_data( super_type::size()) {}

在这里,dir_fwd (和 dir_rev )表示 c(和 fortran)存储顺序。array_dyn 类在这里 [ https://svn.boost.org/svn/boost/sandbox/variadic_templates/sandbox/array_dyn ].

很高兴提供更多代码,但我认为我遇到的问题是在这里引起的:当我使用

std::vector<size_t> newsizes({2,3});
bisArray<int> newarray(newsizes); // using constructor #2

然后出现错误信息

no type named my_data in struct 'array_dyn<int>' 

以前关于此错误的 StackOverflow 帖子提到了循环定义和前向声明;但这不是我在这里做的。我只是继承自 array_dyn ,它有一个属性 my_data , 但是当我用派生类 bisArray 创建一个对象时,它说它的基类没有这个属性。

我是否使用了错误的继承机制?还是访问方式不对?

最佳答案

简答:不能在派生类的构造函数中初始化基类成员。

您可能想尝试这样的事情(假设 my_data 有合适的设置方法):

template < typename Sizes >
bisArray( dirs a_dir, Sizes const& a_sizes={} ):
super_type ( a_dir, a_sizes ) {
super_type::my_data.set_size( super_type::size());
}

更长的版本,我能从 C++ standard 找到最好的解释在第 12.6.1.10 段中:

In a non-delegating constructor, initialization proceeds in the following order:

— First, and only for the constructor of the most derived class (1.8), virtual base classes are initialized in the order they appear on a depth-first left-to-right traversal of the directed acyclic graph of base classes, where “left-to-right” is the order of appearance of the base classes in the derived class base-specifier-list.

— Then, direct base classes are initialized in declaration order as they appear in the base-specifier-list (regardless of the order of the mem-initializers).

— Then, non-static data members are initialized in the order they were declared in the class definition (again regardless of the order of the mem-initializers).

— Finally, the compound-statement of the constructor body is executed

现在,这听起来有点迂回,但是非静态数据成员按照它们在类定义中声明的顺序初始化的约束意味着您不能在类定义中初始化基类成员派生类。

关于c++ - 派生类错误 'no type named my_data in <base class>',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19370281/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com