【问题标题】:Member declaration not found when class template takes an integer类模板采用整数时未找到成员声明
【发布时间】:2016-07-26 23:02:57
【问题描述】:

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

这有什么问题?

【问题讨论】:

  • 致那些投反对票/投票结束的人:你能证明自己的合理性,以便我改进这个问题吗?
  • 这是 CDT 的“实现方法”操作中的一个错误。我提交了bugs.eclipse.org/bugs/show_bug.cgi?id=510289 进行跟踪。

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


【解决方案1】:

Eclipse 生成器似乎遗漏了实现的关键部分。即使它们没有被移出头文件,这也会有同样的问题。

通常,模板与类型名称一起使用,例如:

template<typename T>
SizeableClass<T>::SizeableClass()
{
}

template<typename T>
SizeableClass<T>::~SizeableClass()
{
}

因此,如果您不使用类型名,那么尖括号 (&lt;&gt;) 之间不需要任何内容​​,这是可以原谅的。

但是,在这种情况下,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 并将它们放入头文件或包含它们来解决。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-08
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    • 1970-01-01
    • 2017-06-28
    相关资源
    最近更新 更多