如果 class 有模板,则定义 class 的常量静态成员时出错

Error defining const static member of class if the class has template

我在 .h 文件中有以下代码:

class Test1 {
    struct A1 {
        int x;
    };
    static const A1 a1;
};

template <class T>
class Test2 {
    struct A2 {
        int x;
    };
    static const A2 a2;
};

我在 .cpp 文件中为 a1a2 定义了值:

const Test1::A1 Test1::a1 = { 5 };

template<class T>
const Test2<T>::A2 Test2<T>::a2 = { 5 };

奇怪的是,对于 Test1,一切正常,但对于 Test2,我在 .cpp 文件的最后一行出现以下错误:

Error C2061 syntax error: identifier 'A2'

Test1Test2 之间的唯一区别是 Test2 有一个模板。为什么这是一个问题,我该如何解决?此外,这也适用:

test.h

struct A3 {
    int x;
};
template <class T>
class Test3 {
    static const A3 a3;
};

test.cpp

template<class T>
const A3 Test3<T>::a3 = { 5 };

所以问题在于使用在模板化 class 中定义的结构,但我无法找出问题所在。

(我正在用 c++14 编译。)

编译器建议修复,请在阅读编译器消息时更加小心。

<source>(17): warning C4346: 'A2': dependent name is not a type
<source>(17): note: prefix with 'typename' to indicate a type
<source>(17): error C2061: syntax error: identifier 'A2'
<source>(17): error C2143: syntax error: missing ';' before '{'
<source>(17): error C2447: '{': missing function header (old-style formal list?)

或者

<source>:17:7: error: missing 'typename' prior to dependent type name 'Test2<T>::A2'
const Test2<T>::A2 Test2<T>::a2 = { 5 };
      ^~~~~~~~~~~~
      typename 
1 error generated.

这意味着正确的代码:

template<class T>
const typename Test2<T>::A2 Test2<T>::a2 = { 5 };

阅读更多:Why do we need typename here?.