说我有课
template <typename T>
class MyClass
{
static int myvar;
}
现在接下来的作业会发生什么?
MyClass<int>::myvar = 5;
MyClass<double>::myvar = 6;
根据标准会发生什么?我会有两个版本的 MyClass::myvar 还是只有一个?
说我有课
template <typename T>
class MyClass
{
static int myvar;
}
现在接下来的作业会发生什么?
MyClass<int>::myvar = 5;
MyClass<double>::myvar = 6;
根据标准会发生什么?我会有两个版本的 MyClass::myvar 还是只有一个?
是的,会有两个具有两个不同值的变量。但那是因为这两者是完全不相关的类。这就是模板的工作方式。不要将它们视为类,而是将它们视为构建类的一组规则。
由于 OP 专门要求引用标准,这是我的回答,其中包括标准的相关引用。
每个专业化都有它自己的副本,myvar
这是有道理的,因为每个专业化都是它自己独特的类。14.7
模板实例化和专业化第6段中的 C++ 标准草案说(强调我的):
从模板实例化的每个类模板特化都有它自己的任何静态成员的副本。
[ Example: template<class T> class X { static T s; }; template<class T> T X<T>::s = 0; X<int> aa; X<char*> bb;
X 有一个 int 类型的静态成员 s,X 有一个 char* 类型的静态成员 s。—结束示例]
从“每个类型名”的模板中实例化一个完全“新类”。而且由于静态成员与类相关联,因此这些类中的每一个都有自己的静态变量副本。