2011-12-17 85 views
7

在VC++ 10中,以下示例因錯誤C2027失敗:「使用未定義類型'X'」。然而g ++ 4.6編譯它就好了。如何在使用CRTP時獲取模板參數的大小?

template<class T> 
class C 
{ 
    static const size_t size = sizeof(T); 
}; 

class X : public C<X> { }; 

那麼哪一個是對的?我如何做到這一點,以便它可以在主流編譯器上運行?

雖然這並不是什麼大問題,因爲VC++仍然允許在C的成員函數中使用sizeof(T)。我只需要重複一些煩人的長類型定義。

編輯: 我意識到我的例子是不好的,因爲我真正想要做的是使用尺寸爲編譯時間常數,以這樣的方式

template<size_t size> class C2 { }; 

template<class T> 
class C 
{ 
    typedef C2<sizeof(T)> A; 
}; 

class X : public C<X> { }; 

兩種編譯器拒絕這個讓我假設它可能不可能,但正如我所說,我仍然可以使用sizeof內部函數。我只是希望我不必在每個函數中重複使用typedef。

template<size_t size> class C2 { }; 

template<class T> 
class C 
{ 
    void foo() { typedef C2<sizeof(T)> A; } 
}; 

class X : public C<X> { }; 

回答

6

靜態構件不能在類本身被初始化,這是因爲類型T被定義的,並且還沒有完成。

但是,您可以在類外將其初始化爲:

template<class T> 
class C 
{ 
    static const size_t size; 
}; 

template<typename T> 
const size_t C<T>::size = sizeof(T); //initialization of the static member 

應該罰款編譯:http://ideone.com/6sNgN

+1

+1正要張貼同樣的事情。 – 2011-12-17 12:27:22

+0

我不認爲這是問題,因爲整型編譯時常量通常可以在類中初始化。儘管我可能會接受它作爲解決方法。 – Timo 2011-12-17 12:35:42

+0

@Timo:這正是問題所在。到那時,靜態成員被解析*並正在嘗試初始化*,類型'T'尚未完成。 – Nawaz 2011-12-17 12:38:04

相關問題