在创建一个在头文件中取整数的模板化C ++类之后,我发现Eclipse无法识别相应.cpp文件中的方法实现。
这是一个采用大小模板参数的示例类:
template <int SIZE>
class SizeableClass
{
public:
SizeableClass();
virtual ~SizeableClass();
};
我告诉Eclipse使用Source =&gt;为我生成实现主体实施方法......
它在头文件中生成了一些内联方法。我将它们移动到.cpp文件以获得整洁并删除了inline
限定符。我的.cpp文件现在看起来像这样:
template<int SIZE>
SizeableClass<>::SizeableClass()
{
}
template<int SIZE>
SizeableClass<>::~SizeableClass()
{
}
但是红色标有“#34;成员声明未找到”#34;错误。它不会用gcc
编译:
SizeableClass.h:2:7: error: provided for ‘template<int SIZE> class SizeableClass’
class SizeableClass
^
它有什么不对?
答案 0 :(得分:4)
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
并将它们放在头文件中或包含它们来解决。