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> { };
+1正要張貼同樣的事情。 – 2011-12-17 12:27:22
我不認爲這是問題,因爲整型編譯時常量通常可以在類中初始化。儘管我可能會接受它作爲解決方法。 – Timo 2011-12-17 12:35:42
@Timo:這正是問題所在。到那時,靜態成員被解析*並正在嘗試初始化*,類型'T'尚未完成。 – Nawaz 2011-12-17 12:38:04