2016-03-03 182 views
0

下面的代碼編譯罰款模板類的靜態const成員變量VS靜態常量成員變量的初始化

template<typename T> 
struct foo 
{ 
    static const T value = 1 + foo::value; 
}; 

但是這一個錯誤

struct foo 
{ 
    static const int value = 1 + foo::value; 
}; 

template<typename T> 
struct foo 
{ 
    static const int value = 1 + foo::value; 
}; 

Error 1 error C2065: 'value' : undeclared identifier c:\visual studio 2013\projects\consoleapplication2\consoleapplication2\consoleapplication2.cpp 13 1 ConsoleApplication2 

我認爲第二種情況無論如何都是合理的

但第一個是它是如何工作的?

有人可以解釋這一點嗎?

回答

2

在第一個示例中,沒有靜態成員變量foo::value,對於這樣的變量僅存在模板,直到您真正嘗試使用它時才存在。所以如果你做了foo<int>::value那麼你也會得到第一個錯誤。

+1

我會補充說,如果OP真的調用'foo :: value',他會得到不同的編譯錯誤,因爲編譯器會嘗試解析靜態字段的遞歸模板調用... –

0

你應該看看Template Instantiation。 模板實例化是在嘗試創建該類的對象時完成的。 首次編譯程序時,靜態成員value的類型取決於您在實例化時傳遞的模板參數。在第二種情況下,foo被完全編譯,編譯器發現該值未被聲明,因此報告了該錯誤。