我有以下代码:
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重现问题。)
如何将模板类的静态成员变量声明/定义/初始化为类的静态成员变量?
答案 0 :(得分:4)
静态成员是根据其类定义的。 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
相同。