6

说我有课

template <typename T>
class MyClass
{
    static int myvar;
}

现在接下来的作业会发生什么?

MyClass<int>::myvar = 5;
MyClass<double>::myvar = 6;

根据标准会发生什么?我会有两个版本的 MyClass::myvar 还是只有一个?

4

3 回答 3

7

是的,会有两个具有两个不同值的变量。但那是因为这两者是完全不相关的类。这就是模板的工作方式。不要将它们视为类,而是将它们视为构建类的一组规则。

于 2013-10-09T14:21:10.010 回答
2

由于 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。—结束示例]

于 2013-10-09T14:36:15.767 回答
1

从“每个类型名”的模板中实例化一个完全“新类”。而且由于静态成员与类相关联,因此这些类中的每一个都有自己的静态变量副本。

于 2013-10-09T14:39:16.900 回答