模板类的静态const成员变量VS静态常量成员变量的初始化
问题描述:
下面的代码编译罚款模板类的静态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
我认为第二种情况无论如何都是合理的
但第一个是它是如何工作的?
有人可以解释这一点吗?
答
在第一个示例中,没有静态成员变量foo::value
,对于这样的变量仅存在模板,直到您真正尝试使用它时才存在。所以如果你做了foo<int>::value
那么你也会得到第一个错误。
答
你应该看看Template Instantiation。 模板实例化是在尝试创建该类的对象时完成的。 首次编译程序时,静态成员value
的类型取决于您在实例化时传递的模板参数。在第二种情况下,foo
被完全编译,编译器发现该值未被声明,因此报告了该错误。
我会补充说,如果OP真的调用'foo :: value',他会得到不同的编译错误,因为编译器会尝试解析静态字段的递归模板调用... –