2016-03-03 154 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被完全编译,编译器发现该值未被声明,因此报告了该错误。