3

给定以下课程

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

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

4

1 回答 1

6

简单的。与任何其他静态非整数类型一样。

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


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

为了对不同类型的成员进行不同的分配T,您必须使用模板特化

要启动模板特化,您必须使用以下语法:

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声明分配。member您也可以在声明模板类的头文件中使用内联文件 (.inl) 和#include.inl 文件。

编辑:

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

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

其中 type 是任何类型。

但是,以下内容会:

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

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

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

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

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

如果你使用普通括号,编译器会认为它是A<type>类中的一个静态函数,如果你不使用括号,你会得到一个undefined reference to 'A<type>::member'链接器错误。你可以在这里看到。

是 Aaron 和我发现这个错误的讨论。

于 2013-04-16T10:00:28.400 回答