我有一个现有的结构如下:
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]“不是可以明确专门化的实体
答案 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)
我发现您的代码存在以下问题。
您没有行
中的类型说明符template<>
Foo<ClassA>::bar = nullptr;
即使添加了类型说明符,例如:
template<>
ClassA* Foo<ClassA>::bar = nullptr;
代码不合法。您不能专门化非静态成员变量。您只能专门化成员函数和静态成员变量。
以下是合法的。
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 = {};
您在问题中引用的链接涉及专门化成员函数,而不是成员变量。