如何将模板类的静态成员变量声明/定义/初始化为类的静态成员变量?

时间:2016-10-18 01:48:30

标签: c++ templates static

我有以下代码:

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重现问题。)

如何将模板类的静态成员变量声明/定义/初始化为类的静态成员变量?

1 个答案:

答案 0 :(得分:4)

静态成员是根据其类定义的。 aA的静态成员,a1a2B的静态成员,您无法混淆其定义。

分别定义它们:

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;由于a1A<int>,因此结果与A<int>::a相同。