C ++模板“不是类型”错误

时间:2017-03-17 00:21:25

标签: c++ templates

我有两个模板化的课程。 CCData和CCNode。第二个(CCNode)声明第一个(CCData)的两个实例作为其受保护变量集的一部分。

在cc_data.tpl.h文件中我们有

template<class T>
 class CCData
 {

 public:

  // Constructor. Allocates memory for the values. Initialise them to
  // zero
  CCData(const unsigned n_values, const unsigned n_history_values=1);

  .
  .
  .
  .

 };

在cc_node.tpl.h文件中我们有

template<class T, class DIM>
  class CCNode
 {

 public:

  // Constructor
  CCNode(const unsigned n_variables, const unsigned n_history_values);

  .
  .
  .
  .

 protected:

  // The number of variables stored in the node
  const unsigned N_variables;

  // The number of history values of the variable stored in the node
  const unsigned N_history_values;

  // Store the spatial position of the node
  CCData<double> X(DIM, N_history_values);

  // Store the values of the variables stored in the node
  CCData<T> U(N_variables, N_history_values);

 };

cc_node.tpl.cpp文件

template<class T, class DIM>
CCNode<T,DIM>::CCNode(const unsigned n_variables, const unsigned n_history_values)
 : N_variables(n_variables), N_history_values(n_history_values)
{ }

有问题的行位于cc_node.tpl.h文件中

  // Store the spatial position of the node
  CCData<double> X(DIM, N_history_values);

  // Store the values of the variables stored in the node
  CCData<T> U(N_variables, N_history_values);

编译器咆哮

cc_node.tpl.h:90:25: error: ‘N_history_values’ is not a type
cc_node.tpl.h:92:15: error: ‘N_variables’ is not a type
cc_node.tpl.h:92:28: error: ‘N_history_values’ is not a type

我的gcc版本

gcc version 5.4.0

除了

之外没有花哨的编译标志
g++ -Wall -pedantic -O0 -g ...

1 个答案:

答案 0 :(得分:1)

您忘记的第一件事是您传递了类型名称(DIM)作为构造函数参数,但构造函数参数应该是值而不是类型名称。 另一个问题是你在.cpp文件中定义了一个模板函数(构造函数)。但您应该在同一个头文件中定义所有模板函数以供使用。 我编辑了你的代码,它对我有用。

 template<class T>
 class CCData
 {

 public:

  // Constructor. Allocates memory for the values. Initialise them to
  // zero
  CCData(const unsigned n_values, const unsigned n_history_values=1)
  {

  }

 };

 template<class T, class DIM>
 class CCNode
 {

 public:

  // Constructor
  CCNode(const unsigned n_variables, const unsigned n_history_values):
      N_variables(n_variables),
      N_history_values(n_history_values),
      X(n_variables,n_history_values),// pass CCData constructor arguments
      U(n_variables,n_history_values)// pass CCData constructor arguments
      {}

 protected:

  // The number of variables stored in the node
  const unsigned N_variables;

  // The number of history values of the variable stored in the node
  const unsigned N_history_values;

  // Store the spatial position of the node
  CCData<double> X;//(DIM, N_history_values); -> DIM is a type name not a value

  // Store the values of the variables stored in the node
  CCData<T> U;//(N_variables, N_history_values);

 };

您必须将Constructor定义放在相同的头文件中。因为编译时编译器需要模板函数定义。