0

下面的Test类有一个静态变量count,在创建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

我猜有两个实例测试和测试(同时调用测试和测试)。但是我想知道为什么int和double有两个实例,因为有两种不同的类型?如果是这样,如何针对不同的数据类型和相同的数据类型跟踪计数变量?这可能是一个简单的问题,但我只想知道它背后的基本过程?

4

4 回答 4

0

因为Test<int>Test<double>是不同的类型。

类模板定义了一组无限制的相关类型的布局和操作。

于 2013-04-11T13:19:37.930 回答
0

是的。有两种不同的类型 Test。一是基于intTest<int>。另一个是基于doubleTest<double>

您可以假设有两个Test类:

class Test_int // Test<int>
{  
private:
  int val; 
//...

class Test_double // Test<double>
{  
private:
  double val; 
//...
于 2013-04-11T13:20:55.340 回答
0

你有2个不同的班级。

每个指定的类模板都是不同的类类型。与 不同的类类型的类名也是
如此。Test<int>Test<double>

编译器为这些类中的每一个生成单独的代码,并因此生成 2 个不同的静态变量。

还有更多,它将为每个包含头文件的编译单元创建代码(因为代码将被“注入”到需要的地方)。

因此,如果您将在 2 个不同的 .cpp 文件中的 2 个不同的类中打印它,您会看到每个编译单元都有一个不同的计数器,即使对于相同的模板类类型也是如此。

于 2013-04-11T13:22:40.520 回答
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_icount_Test$D_i

于 2013-04-11T13:23:20.923 回答