类模板采用整数时找不到成员声明



在创建了一个在头文件中接受整数的模板化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并将它们放在头文件中或包含它们来解决。

相关内容

最新更新