我有以下代码:
template <typename T>
class A {
public:
static int a;
};
class B {
public:
static A<int> a1;
static A<double> a2;
};
int B::a1::a = 0; --> It gives an error "a1 is not a class, namespace, enumeration"
(我在XCode中使用llvm编译器。我也可以用gcc重现该问题。)
如何声明/定义/初始化模板类的静态成员变量作为类的静态成员变量?
最佳答案
静态成员是基于其类定义的。 a
是A
的静态成员,a1
和a2
是B
的静态成员,您不能混淆它们的定义。
分别定义它们:
template <typename T>
int A<T>::a = 0;
A<int> B::a1;
A<double> B::a2;
如果要模板特殊化来定义
A<T>::a
,它将看起来像:template <typename T>
int A<T>::a = 0;
template <typename T>
int A<int>::a = 1;
template <typename T>
int A<double>::a = 2;
然后对于
A<int>::a
,其初始值将为1
;对于A<double>::a
,其初始值为2
;对于其他类型,例如A<char>::a
,其初始值为0
。注意,这些定义仍然独立于B
类的定义。如果要从
a
访问B::a1
,则可以编写B::a1.a
;由于a1
是A<int>
,因此结果与A<int>::a
相同。关于c++ - 如何声明/定义/初始化模板类的静态成员变量作为类的静态成员变量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40098277/