下面的类Test有一个静态变量计数,它在创建类Test的对象时递增,
#include <iostream>
using namespace std;
template <class T> class Test
{
private:
T val;
public:
static int count;
Test()
{
count++;
}
// some other stuff in class
};
template<class T>
int Test<T>::count = 0;
int main()
{
Test<int> a;
Test<int> b;
Test<double> c;
cout << Test<int>::count << endl; // prints 2
cout << Test<double>::count << endl; //prints 1
getchar();
return 0;
}
输出: 2 1
我猜测试和测试有两个实例(同时调用Test和Test)。但我想知道为什么int和double有两个实例,因为有两种不同的类型?如果是这样,如何跟踪不同数据类型和相同数据类型的计数变量?这可能是一个简单的问题,但我只是想知道它背后的基本过程?
答案 0 :(得分:0)
由于Test<int>
和Test<double>
是不同的类型。
类模板定义了一组无限相关类型的布局和操作。
答案 1 :(得分:0)
是。有两种不同类型的Test
。一个基于int
:Test<int>
。另一个基于double
:Test<double>
。
您可以假设有两个Test
类:
class Test_int // Test<int>
{
private:
int val;
//...
class Test_double // Test<double>
{
private:
double val;
//...
答案 2 :(得分:0)
你有2个不同的班级。
每个指定的类模板都是不同的类类型
因此,Test<int>
是类型的类名,与Test<double>
不同。
编译器为每个类生成单独的代码,因此有2个不同的静态变量。
还有更多,它将为包含标题的每个编译单元创建代码(因为代码将在需要的地方“注入”)。
因此,如果您将在2个不同的.cpp文件中的2个不同的类中打印它,您将看到每个编译单元都有一个不同的计数器,即使对于相同的模板类类型也是如此。
答案 3 :(得分:0)
是的,你得到一个实例:
template<class T>
int Test<T>::count = 0;
适用于T
的每种类型。当然是实例化的
Test()
{
count++;
}
想象一下,你添加了:
Test()
{
val = 0;
count++;
}
您可以立即了解为什么必须为每种类型提供其他功能。 Test<int>
与Test<double>
不同。
每个count
变量的全名是:
Test<int>::count
Test<double>::count
编译器将分别“编辑”成count_Test$i_i
和count_Test$D_i
的某些内容(我刚刚提到了,实际上它可能完全不同)