我有两个模板化的课程。 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 ...
答案 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定义放在相同的头文件中。因为编译时编译器需要模板函数定义。