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

时间:2016-07-26 23:02:58

标签: c++ eclipse templates generics eclipse-cdt

在创建一个在头文件中取整数的模板化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
       ^

它有什么不对?

1 个答案:

答案 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并将它们放在头文件中或包含它们来解决。