如何在结构模板中初始化非静态成员变量?

时间:2015-08-18 15:19:19

标签: c++ templates

我有一个现有的结构如下:

template<typename T>
struct Foo
{
    T bar;

    Foo() {}

    Foo(T bar) : bar(bar) {}
};

如何提供专业化以便T bar设置为值?我试图使用this question中列出的方法,使用以下内容:

template<>
Foo<ClassA>::bar = nullptr;

但是这在Visual Studio 2015中出现了以下错误:

Foo: -

  

此声明没有存储类或类型说明符

bar: -

  

ClassA Foo :: bar [with T = ClassA]“不是可以明确专门化的实体

2 个答案:

答案 0 :(得分:1)

template<>
Foo<ClassA>::bar = nullptr;

这种专业化仅适用于静态成员。您想在构造期间设置值。您可以为您的类提供一个静态变量,以用作bar的默认值,并将其专门化为:

template<typename T>
struct Foo
{
    static T barDefault;

    T bar;

    Foo(T bar=barDefault) : bar(bar) {}
};

template <typename T>
T Foo<T>::barDefault = T{};

template<>
ClassA Foo<ClassA>::barDefault = nullptr;

答案 1 :(得分:1)

我发现您的代码存在以下问题。

  1. 您没有行

    中的类型说明符
    template<>
    Foo<ClassA>::bar = nullptr;
    
  2. 即使添加了类型说明符,例如:

    template<>
    ClassA* Foo<ClassA>::bar = nullptr;
    

    代码不合法​​。您不能专门化非静态成员变量。您只能专门化成员函数和静态成员变量。

  3. 以下是合法的。

    template<typename T>
    struct Foo
    {
        T bar;
        static T bar2;
    
        Foo() {}
    
        Foo(T bar) : bar(bar) {}
    };
    
    
    struct ClassA {};
    
    // Definition of Foo<T>::bar2 for most types.
    template <typename T>
    T Foo<T>::bar2 = {};
    
    // Definition of Foo<T>::bar2 for T=ClassA.
    template <>
    ClassA Foo<ClassA>::bar2 = {};
    

    您在问题中引用的链接涉及专门化成员函数,而不是成员变量。