我退出的原因是什么?

时间:2010-05-13 11:46:52

标签: c++ templates

包括“stdafx.h”

#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

我退出的原因是什么?

6 个答案:

答案 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>::iSample<float>::iSample<char>::i是三个不同的变量。因此,你得到111。

答案 3 :(得分:1)

Sample是一个类模板,在这种情况下用于创建三个不同的类,每个类都有自己的不同i

答案 4 :(得分:0)

当你有一个带有静态成员变量的模板类时,编译器应该确保对于“每个”类型名称T,只有一个静态变量的副本。由于您已实例化具有三种不同类型的Sample类,因此您会看到每种类型的输出为“1”。

答案 5 :(得分:0)

Sample<int>Sample<float>Sample<char>是三种不同的类型,每种类型都有自己的静态变量。

如果您想获得123,则必须将static int i放入公共基类。