我有以下代码:

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

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

最佳答案

静态成员是基于其类定义的。 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相同。

关于c++ - 如何声明/定义/初始化模板类的静态成员变量作为类的静态成员变量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40098277/

10-13 05:26