#include<iostream.h>
template<class T>
class Sample
{
public:
Sample();
static int i;
};
template<class T>
int Sample<T>::i = 0;
template<class T>
Sample<T>::Sample()
{
i++;
cout<<i;
}
void main()
{
Sample<int>s1;
Sample<float>s2;
Sample<char>s3;
}
输出:111
我退出的原因是什么?
答案 0 :(得分:7)
输出为111
(与123
相对)的原因是Sample<int>
,Sample<float>
和Sample<char>
是三种完全不同的类型,因此它们每个都有自己独立的静态变量i
。
您有一个名为Sample
的模板,每次使用不同的模板参数对其进行实例化时,它都会使用该模板根据模板动态创建新类。但是使用模板创建的类彼此之间没有关系,并且不共享静态信息。
答案 1 :(得分:2)
尝试添加行
Sample<float> s2_2;
到main()
(偶然会返回int
)。这应该有助于说明其他人已经回答的内容。
此外,您可以在输出中包含类型信息:
#include <typeinfo>
:
:
template<class T>
Sample<T>::Sample()
{
i++;
std::cout << typeid(T).name() << ':' << i << std::endl;
}
答案 2 :(得分:1)
Sample<int>::i
,Sample<float>::i
和Sample<char>::i
是三个不同的变量。因此,你得到111。
答案 3 :(得分:1)
Sample
是一个类模板,在这种情况下用于创建三个不同的类,每个类都有自己的不同i
。
答案 4 :(得分:0)
当你有一个带有静态成员变量的模板类时,编译器应该确保对于“每个”类型名称T,只有一个静态变量的副本。由于您已实例化具有三种不同类型的Sample类,因此您会看到每种类型的输出为“1”。
答案 5 :(得分:0)
Sample<int>
,Sample<float>
,Sample<char>
是三种不同的类型,每种类型都有自己的静态变量。
如果您想获得123
,则必须将static int i
放入公共基类。