C++ 类不是自身的基础

Posted

技术标签:

【中文标题】C++ 类不是自身的基础【英文标题】:C++ Class is not base of itself 【发布时间】:2012-07-09 08:01:12 【问题描述】:

我不确定需要多少信息才能回答这个问题,如果需要更多信息,请告诉我。

我正在修改我写的一个大代码,当我突然遇到这条消息时:error: type 'integer' is not a direct base of 'integer'。我知道这是一个继承问题,但我没有继承其他类。

导致这个问题的代码是

integer(const std::string & val, uint16_t base): integer(val.begin(), val.end(), base) 

integer(iterator start, iterator end, uint16_t base) 

已定义。

我需要做什么来解决这个问题?

编辑:我用 -std=c++0x 编译,根据答案,我应该能够编译,除非我的编译器是旧的:我认为 gcc 4.6.2

【问题讨论】:

更新答案,在 gcc 4.7 及以后版本中可用。 【参考方案1】:

看起来您正试图直接调用另一个构造函数。你不能在 C++03 中做到这一点,但你 can do exactly that in C++11:

class SomeType  
    int number;

public:
    SomeType(int new_number) : number(new_number) 
    SomeType() : SomeType(42) 
;

您需要 g++ 4.7 或更高版本才能使用此功能,4.6 尚不支持此功能,即使使用 -std=c++0x,我在我的系统上测试了这两个版本。

【讨论】:

@calccrypto GCC 4.6 不支持这个。我认为是 4.7。【参考方案2】:

不允许像这样调用同一class的其他构造函数(C++11中有委托构造函数)。您需要初始化类的成员(就像您在其他构造函数中所做的那样)。

编辑:

根据C++0x/C++11 Support in GCC ,委托构造函数是在 GCC v4.7 中实现的

【讨论】:

【参考方案3】:

您不能在不同构造函数的初始化列表中调用同一类的构造函数(在 C++03 中)。但是您可以相应地初始化成员:

integer(const std::string & val, uint16_t base): _start(val.begin())
                                                 _end(val.end())
                                                 _base(base)

【讨论】:

【参考方案4】:

它是 not supported in g++-4.6(“委托构造函数 | N1986 | 否”),但 is supported in 4.7。

【讨论】:

以上是关于C++ 类不是自身的基础的主要内容,如果未能解决你的问题,请参考以下文章

c++基础知识

C++ 基础知识整理

C++ 基础知识整理

C++ 基础知识整理

C++基础教程——递归( recursion)

c++ 虚函数 如何调父类 而非子类