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

Member declaration not found when class template takes an integer

在创建一个在头文件中采用整数的模板化 C++ class 之后,我发现 Eclipse 无法识别我在相应 .cpp 文件中的方法实现。

这是一个采用尺寸模板参数的示例 class:

template <int SIZE>
class SizeableClass
{
public:
    SizeableClass();
    virtual ~SizeableClass();
};

我通过 Source => Implement Method 告诉 Eclipse 为我生成实现主体...

它在头文件中产生了一些内联方法。为了整洁起见,我将它们移到了 .cpp 文件中,并删除了 inline 限定符。我的 .cpp 文件现在看起来像这样:

template<int SIZE>
SizeableClass<>::SizeableClass()
{
}

template<int SIZE>
SizeableClass<>::~SizeableClass()
{
}

但是这是带有 "Member declaration not found" 错误的红色下划线。它也不会用 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()
{
}

因此,如果您不使用类型名称,那么 angular 括号 (<>) 之间不需要任何内容​​是可以原谅的。

但是,在这种情况下,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()
{
}

附带说明一下,链接程序时无法正确编译。由于函数是模板而不是实际实现,每个包含头文件的 class 也需要查看模板定义。这可以通过再次创建函数 inline 并将它们放入头文件或包含它们来解决。