如果 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
文件中为 a1
和 a2
定义了值:
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'
Test1
和 Test2
之间的唯一区别是 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?.
我在 .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
文件中为 a1
和 a2
定义了值:
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'
Test1
和 Test2
之间的唯一区别是 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?.