C++ 如何根据模板类中的T初始化类型为的静态常量成员?

C++ 如何根据模板类中的T初始化类型为的静态常量成员?,c++,templates,C++,Templates,给定以下类 template <class T> class A { static const B<T> member; }; 模板 甲级{ 静态常数B成员; }; 如何分别为每个类A实例化member。与任何其他静态非整数类型一样 template <class T> class A { static const B<T> member; }; template <class T> const B<T&g

给定以下类

template <class T>
class A {
    static const B<T> member;
};
模板
甲级{
静态常数B成员;
};

如何分别为每个类
A
实例化
member
。与任何其他静态非整数类型一样

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


template <class T>
const B<T> A<T>::member/*(optional-args)*/;
显式定义的语法基本上与以下语法相同:

template <class T>
const B<T> A<T>::member/*(optional-args)*/;
注意:如果您希望在此场景中调用模板专业化的默认构造函数,请参见下面的编辑

您可以用
类型
替换您想要的任何类型。有了它,您可以为每种可能的类型提供不同的参数。虽然如果你做的太多,你应该考虑一下你的设计是否真的适合使用模板。 它正在运行(在线),可以随意克隆和使用它

我想我应该提到声明必须位于模板类所在的位置。换句话说,如果在头文件中声明了
A
,则还必须在头文件中声明
成员的分配。您也可以使用内联文件(.inl)和
#在声明模板类的头文件中包含
的.inl文件

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

 template <>
 const B<type> A<type>::member/*()*/;
模板
常量B A::成员/*()*/;
其中type是任意类型

然而,以下情况确实存在:

 template <class T>
 const B<T> A<T>::member/*()*/;
模板
常量B A::成员/*()*/;
我不确定这是一个bug,还是语法不正确。 我建议您改为执行以下操作:

 template <>
 const B<type> A<type>::member = B<type>();
模板
常量B A::成员=B();
或者,如果您使用的是C++11,则可以使用花括号调用默认构造函数,如下所示:

 template <>
 const B<type> A<type>::member{};
模板
常量B A::成员{};
如果使用常规方括号,编译器会认为它是
a
类中的静态函数,如果不使用方括号,则会出现
未定义的引用“a::member”
链接器错误。你可以看到


Aaron和我在讨论中发现了这个错误。

如果您没有指定
t
,这怎么可能是一个实例?我希望能够分别为每种类型
T
指定常量。我更新了我的问题以反映这一点。正如你想使用模板专业化?是的,没错,我只是不知道它叫什么。另外,你知道模板是如何工作的吗?一旦您创建了
A
的对象,其中T是任意类型,编译器将通过使用您指定的类型生存
T
来生成一个重复的类。换句话说,成员将被分配。我将编辑模板专业化的答案。是的,我知道模板是如何工作的。很抱歉,如果我最初没有很好地说明这个问题。
 template <>
 const B<type> A<type>::member = B<type>();
 template <>
 const B<type> A<type>::member{};