C++子类将父类的名称误认为字段
C++ child class mistaking parent class's name for a field
我正在尝试修改一个C++项目供自己使用,但在创建派生类时遇到问题。
当我让派生类的构造函数调用其父类的构造函数时,我收到一条错误消息,指出派生类没有与其父类名称对应的字段。我不明白我的问题出在哪里。
.h文件的相关部分如下:
// grandparent_class ////////////////////////////////////////////////////////////////
template <typename T, typename Tds1 = T, typename Tds2 = T>
class grandparent_class : public module_1_1<T> {
public:
grandparent_class(uint nfeatures, const char *name = "grandparent_class");
virtual ~grandparent_class();
// parent_class ////////////////////////////////////////////////////////////////
template <typename T, typename Tds1 = T, typename Tds2 = T>
class parent_class : public grandparent_class<T,Tds1,Tds2> {
public:
parent_class(uint nclasses, double target_factor = 1.0,
bool binary_target = false,
t_confidence conf = confidence_max,
bool apply_tanh = false, const char *name = "parent_class",
int force_class = -1, int single_output = -1,
idxdim *kerd = NULL, double sigma_scale = 3,
bool silent = false);
virtual ~parent_class();
// members
protected:
int ctr;
};
// child_class (The Class I'm Introducing)////////////////////////////////////////////
template <typename T, typename Tds1 = T, typename Tds2 = T>
class child_class : protected parent_class<T,Tds1,Tds2> {
public:
child_class(uint nclasses, double target_factor = 1.0,
bool binary_target = false,
t_confidence conf = confidence_max,
bool apply_tanh = false, const char *name = "child_class",
int force_class = -1, int single_output = -1,
idxdim *kerd = NULL, double sigma_scale = 3,
bool silent = false);
virtual ~child_class();
};
//////////////////////////////////////////////////////////////////////////////
我为我的子类定义构造函数,如下所示:
//////////////////////////////////////////////////////////////////////////////
template <typename T, typename Tds1, typename Tds2>
child_class<T,Tds1,Tds2>::
child_class(uint nclasses, double target_factor, bool binary_target_,
t_confidence conf, bool apply_tanh_, const char *name_,
int force, int single, idxdim *kerd, double sigma_scale,
bool silent)
: parent_class(nclasses, target_factor, binary_target_,
conf, apply_tanh_, name_,
force, single, kerd, sigma_scale, silent)
{
...
};
我的子类声明和定义与父级和祖父级声明和定义位于同一文件中,因此我认为不存在缺少"include"的问题。据我所知,我指示继承的语法是正确的,并且我正确地调用了父类的构造函数。
然而,当我编译时,我收到以下错误:
/home/me/ebl_answer.hpp: In constructor ‘ebl::child_class<T, Tds1, Tds2>::child_class(uint, double, bool, ebl::t_confidence, bool, const char*, int, int, ebl::idxdim*, double, bool)’:
/home/me/ebl_answer.hpp:416:4: error: class ‘ebl::child_class<T, Tds1, Tds2>’ does not have any field named ‘parent_class’
: parent_class(nclasses, target_factor, binary_target_,
如果有人能看到我的错误,那将非常有帮助......
为了使用继承,必须完全定义继承自的类。您不能从类模板继承,因为它不是一个类型,它只是用于消除(实例化)真实类型的东西。这就是您在声明中所做的。调用基类的构造函数也是如此。
尝试使用parent_class<T, Tds1, Tds2>
template <typename T, typename Tds1, typename Tds2>
child_class<T,Tds1,Tds2>::
child_class(uint nclasses, double target_factor, bool binary_target_,
t_confidence conf, bool apply_tanh_, const char *name_,
int force, int single, idxdim *kerd, double sigma_scale,
bool silent)
: parent_class<T, Tds1, Tds2>(nclasses, target_factor, binary_target_,
conf, apply_tanh_, name_,
force, single, kerd, sigma_scale, silent)
{
...
}
请参阅此实时示例。
据
我所知,你只是在祖父母课结束时错过了一个};
。 当我添加它(并调整代码以删除我没有的类)时,它在 VS 中编译得很好。
相关文章:
- 将结构字段的类型展开为可变模板参数
- 将位字段导出到数组
- 为了方便起见,我应该避免公开私有字段变量吗
- 当字段可以为null时,如何使用C++接口在Avro中写入数据
- 在java中读取c++字节的位字段
- 链接器找不到在虚拟类 c++ 中访问的静态字段的符号
- 私有字段对象与私有继承?
- 声明没有默认构造函数的字段
- C++内存模型和位字段的最大序列
- 声明为无效的变量或字段'...' Ardunio 编译器上的错误
- 如何在QByteArray中放置和检索位字段而不会感到痛苦?
- C++ win32 如何使密码字段可选并启用复制和粘贴?
- 如何通过UDP接收QByteArray并将其解析为位字段结构?
- 仅匹配集合中的某些字段
- 结构字段名称与 GDB 中的 STL 数组冲突
- 如何使用位字段将数据从二进制文件复制到结构中?
- 结构体和类的不同大小(),彼此具有相同的字段类型
- 如何避免在数据结构中包含存储为字段的类?
- 聚合初始化和删除的复制构造函数,也称为不可复制的 obejcts 作为字段
- C++子类将父类的名称误认为字段