【问题标题】:How can I Declare/define/initialize a static member variable of template classes as static member variables of a class?如何将模板类的静态成员变量声明/定义/初始化为类的静态成员变量?
【发布时间】:2016-10-18 01:48:29
【问题描述】:

我有以下代码:

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

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

【问题讨论】:

    标签: c++ templates static


    【解决方案1】:

    静态成员是根据它们的类定义的。 a 是 A 的静态成员,a1 和 a2 是 B 的静态成员,不能混淆它们的定义。

    分别定义它们:

    template <typename T>
    int A<T>::a = 0;
    
    A<int> B::a1;
    A<double> B::a2;
    

    如果你想要模板特化来定义A&lt;T&gt;::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&lt;int&gt;::a,初始值为1,对于A&lt;double&gt;::a,初始值为2,对于其他类型如A&lt;char&gt;::a,初始值为0。请注意,定义仍然独立于 B 类的定义。

    如果你想从B::a1访问a,你可以写B::a1.a;因为a1 是A&lt;int&gt;,所以结果与A&lt;int&gt;::a 相同。

    【讨论】:

    • 此外,您应该在标题中定义模板成员A&lt;T&gt;::a,以及在源文件中定义其余部分或模板,以及B 的(非模板)成员。跨度>
    • 'a' 不是 A 和 A 中的每一个的静态成员变量,而不是 A 中的一个吗? (没有名为“A”的类。我认为只有 A 和 A?)
    • @syko 是的,A&lt;int&gt; 有一个静态成员a,而A&lt;double&gt; 有自己的静态a。上述定义将用于这些情况。所以如果你使用A&lt;int&gt;,A&lt;int&gt;::a将被定义,如果你使用A&lt;char&gt;,A&lt;char&gt;::a将被定义......
    • @songyuanyao 谢谢。那么我如何访问 B 的 a1 的“a”? 'B::a1::a' 不能用于引用。
    • @syko 应该是B::a1.a;由于a1 是A&lt;int&gt;,所以结果与A&lt;int&gt;::a 相同。
    猜你喜欢
    • 2021-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-10
    • 1970-01-01
    相关资源
    最近更新 更多