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