如何根据模板化类中的T初始化类型的静态const成员?

时间:2013-04-16 09:56:09

标签: c++ templates

给出以下课程

template <class T>
class A {
    static const B<T> member;
};

如何分别为每个班级member实例化A<T>

1 个答案:

答案 0 :(得分:6)

简单。就像使用任何其他静态非整数类型一样。

template <class T>
class A {
    static const B<T> member;
};


template <class T>
const B<T> A<T>::member/*(optional-args)*/;

为了为不同类型的T分配不同的成员,您必须使用template specialisation

要开始模板专业化,您必须使用以下语法:

template<>
// ... explicit definition

显式定义的语法基本上与以下语法相同:

template <class T>
const B<T> A<T>::member/*(optional-args)*/;

除了template <class T>之外,您使用template<>,而T位于template<> const B<type> A<type>::member(args); ,您可以使用实际类型。

例如:

type

注意:如果您希望在此方案中使用模板专业化调用默认构造函数,请参阅下面的编辑。

您可以将A替换为您想要的任何类型。有了这个,您可以为每种可能的类型提供不同的参数。虽然如果你太专注,你应该考虑你的设计是否真的适合使用模板。

Here它在行动(在线),随意克隆并玩弄它。

我想我会提到声明必须是模板类所在的位置。换句话说,如果在标头中声明member,则还必须在头文件中声明#include的分配。您也可以在声明模板类的头文件中使用内联文件(.inl)和 template <> const B<type> A<type>::member/*()*/; .inl文件。

编辑:

似乎在C ++ 98中,如果引用成员变量,以下调用默认构造函数的语法不会在GCC或clang下编译:

 template <class T>
 const B<T> A<T>::member/*()*/;

其中type是任何类型。

但是以下情况:

 template <>
 const B<type> A<type>::member = B<type>();

我不确定这是一个错误,还是只是错误的语法。 我建议改为执行以下操作:

 template <>
 const B<type> A<type>::member{};

或者,如果您使用的是C ++ 11,则可以使用花括号来调用默认构造函数,如下所示:

A<type>

如果使用常规括号,编译器将在undefined reference to 'A<type>::member'类中使用静态函数,如果不使用括号,则会出现{{1}}链接器错误。你可以看到here

Here是Aaron和我发现此错误的讨论。