在创建了一个在头文件中接受整数的模板化C++类后,我发现Eclipse无法在相应的.cpp文件中识别我的方法实现。
下面是一个使用大小模板参数的示例类:
template <int SIZE>
class SizeableClass
{
public:
SizeableClass();
virtual ~SizeableClass();
};
我告诉Eclipse用Source=>Implement Method为我生成实现体。。。
它在头文件中生成了一些内联方法。为了整洁起见,我将它们移到.cpp文件中,并删除了inline
限定符。我的.cpp文件现在看起来是这样的:
template<int SIZE>
SizeableClass<>::SizeableClass()
{
}
template<int SIZE>
SizeableClass<>::~SizeableClass()
{
}
但这一点用红色下划线加上"找不到成员声明"错误。它也不会用gcc
编译:
SizeableClass.h:2:7: error: provided for ‘template<int SIZE> class SizeableClass’
class SizeableClass
^
它怎么了?
Eclipse生成器似乎错过了实现的一个关键部分。即使它们没有从头文件中移出,也会出现同样的问题。
通常,模板与类型名称一起使用,例如:
template<typename T>
SizeableClass<T>::SizeableClass()
{
}
template<typename T>
SizeableClass<T>::~SizeableClass()
{
}
因此,如果你不使用类型名,那么在尖括号(<>
)之间就不需要任何东西,这是可以原谅的。
但是,在这种情况下,SIZE
模板参数需要放在这些括号中。.cpp文件应为:
template<int SIZE>
SizeableClass<SIZE>::SizeableClass()
{
}
template<int SIZE>
SizeableClass<SIZE>::~SizeableClass()
{
}
// Additionally, if there are any methods that return SizeableClass, they also need to be parametrized
template<int SIZE>
SizeableClass<SIZE> SizeableClass<Size>::myMethod()
{
}
附带说明一下,在链接程序时,这将无法正确编译。由于函数是模板而不是实际实现,因此包含头文件的每个类都需要查看模板定义。这可以通过再次生成函数inline
并将它们放在头文件中或包含它们来解决。