2014-12-22 156 views
0

我想知道爲什麼我不能在類定義中實例化一個類的對象。爲什麼我不能在類定義中實例化同一類的對象

例如在下面的代碼中,我得到的錯誤爲 「field」a'has incomplete type「

但在模板類C中沒有這樣的錯誤。

#include <iostream> 

using namespace std; 
template < template <typename> class TT> class X 
{ 
}; 

template < typename T> class C 
{ 
    C no; 
}; 

class obj 
{ 
    public: 
    obj a; 
} 

int main() 
{ 
    return 0; 
} 

回答

4

如果你真的想實例C那麼,是的,你會得到同樣的錯誤。類模板一般不引起編譯錯誤:實例他們成爲班級的作用:

template <typename T> 
class C 
{ 
    C no; 
}; 

int main() 
{ 
    C<int> c; // error: 'C<T>::no' has incomplete type 
} 

一個類的實例不能包含自身的實例;這將需要無限的記憶。 A C<int>將包含一個C<int>,其中將包含一個C<int>,其中將包含一個C<int>&hellip;

更正式地說,因此不可能確定C<int>的大小,這就是標準禁止該程序所使用的問題。

1

模板之一也導致了一個錯誤,你會嘗試實例化該模板。由於編譯器分兩個階段實例化,因此您沒有收到錯誤。

1)它將檢查語法錯誤的模板,併爲任何不一致性標記錯誤。

2)當你實例化它時,它會檢查所有的操作是否在提供的參數上有明確定義的語義。

您已經過去了1,但沒試過2.

0

這將導致類的構造函數無限遞歸調用(C在這種情況下)。所以這是不允許的;您可以使用與類相同類型的指針或引用作爲同一類的數據成員。

相關問題