2012-07-09 39 views
7

我不完全確定需要多少信息來回答這個問題,所以告訴我是否需要更多信息。C++類不是自己的基礎

我修改了一個大的代碼,當我突然遇到這條消息時寫道: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) 

已被定義。

我需要做些什麼來解決這個問題?

編輯:IM與編譯-std = C++ 0x中,其中根據答案,我應該能夠編譯,除非我的編譯器很古老:GCC 4.6.2,我認爲

+2

更新回答,可在gcc 4.7以上。 – hmjd 2012-07-09 08:11:27

回答

19

它看起來像你想直接調用另一個構造來實現。你可以這樣做,在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,我在我的系統上測試了這兩個版本。

+0

即時編譯與-std = C++ 0x – calccrypto 2012-07-09 08:09:14

+3

@calccrypto GCC 4.6不支持這一點。我認爲4.7。 – Flexo 2012-07-09 08:10:45

3

你不能在不同構造函數的初始化程序列表中調用同一個類的構造函數(在C++ 03中)。但是,你可以相應地初始化成員:

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

不允許調用相同class像其他構造函數(也有在C++ 11委派構造函數)。你需要初始化這個類的成員(正如你在其他構造函數中完成的那樣)。

編輯:

C++0x/C++11 Support in GCC ,委託構造函數是在GCC V4.7