以下代码编译正常
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
我认为第二种情况无论如何都是合理的
但首先是它如何运作?
有人可以解释一下吗?
答案 0 :(得分:2)
在第一个示例中,没有静态成员变量foo::value
,此类变量只存在模板,在您实际尝试使用它之前它不存在。所以如果你这样做, foo<int>::value
然后你也会得到第一个错误。
答案 1 :(得分:0)
你应该看Template Instantiation。
模板实例化在尝试创建该类的对象时完成。
第一次编译程序时,静态成员value
的类型取决于您在实例化时传递的模板参数。在第二种情况下,foo
被完全编译,编译器发现该值未声明,因此报告错误。