模板类的静态const成员变量vs静态const成员变量初始化

时间:2016-03-03 06:55:37

标签: c++ templates

以下代码编译正常

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 个答案:

答案 0 :(得分:2)

在第一个示例中,没有静态成员变量foo::value,此类变量只存在模板,在您实际尝试使用它之前它不存在。所以如果你这样做, foo<int>::value然后你也会得到第一个错误。

答案 1 :(得分:0)

你应该看Template Instantiation。 模板实例化在尝试创建该类的对象时完成。 第一次编译程序时,静态成员value的类型取决于您在实例化时传递的模板参数。在第二种情况下,foo被完全编译,编译器发现该值未声明,因此报告错误。