给出以下课程
template <class T>
class A {
static const B<T> member;
};
如何分别为每个班级member
实例化A<T>
?
答案 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和我发现此错误的讨论。