【问题标题】:Compiling error on template method, return is instance from inner class [duplicate]模板方法编译错误,返回是内部类的实例[重复]
【发布时间】:2012-01-04 23:26:45
【问题描述】:

这是一个简化的例子:

template<typename T>
class MyTemplate
{
  class Inner {};
  Inner met();
};

template<typename T>
MyTemplate<T>::Inner  MyTemplate<T>::met()
{ }

我收到以下编译错误:

expected constructor, destructor, or type conversion before 'met'

我使用 GCC。似乎编译器无法将 MyTemplate&lt;T&gt;::Inner 识别为正确的类。我怎样才能解决这个问题?我尝试在这里和那里粘贴typename 关键字无济于事。现在,我可以设法编译它的唯一方法是在类声明中内联方法定义,我想避免这种情况。

【问题讨论】:

  • typename MyTemplate&lt;T&gt;::Inner MyTemplate&lt;T&gt;::met() 我的 GCC 4.6 对你的代码很满意。您使用的是哪个版本的 GCC?

标签: c++ templates


【解决方案1】:

Clang 报告以下内容:

error: missing 'typename' prior to dependent type name
'MyTemplate<T>::Inner' MyTemplate<T>::Inner  MyTemplate<T>::met()
^~~~~~~~~~~~~~~~~~~~ typename  1 error generated.

并将typename 放置在适当的位置修复它。

template<typename T>
class MyTemplate
{
  class Inner {};
  Inner met();
};

template<typename T>
typename MyTemplate<T>::Inner  MyTemplate<T>::met()
{ }

你把 typename 放在正确的位置了吗?如果是这样,那么这一定是 G++ 中的一个错误。

【讨论】:

  • 废话……我可以发誓我试过了。谢谢(它有效)!
  • 虽然这回答了这个问题,但如果你能给提问者一个关于从属名称的提示以及为什么这是相关的,那就太好了。
  • @phresnel 感谢您让我进行一些额外的谷歌搜索,这很有启发性!
【解决方案2】:

MyTemplate::met的返回类型为依赖名,所以需要在其前加上typename关键字。以下在 gcc-4.5.1 上编译

template<typename T>
struct MyTemplate
{
  class Inner {};
  Inner met();
};

template<typename T>
typename MyTemplate<T>::Inner  MyTemplate<T>::met()
{
  return typename MyTemplate<T>::Inner();
}

int main()
{
  MyTemplate<int> foo;

  MyTemplate<int>::Inner bar = foo.met();
}

【讨论】:

  • 嗯,它几乎可以编译。 met 需要返回一个值。
【解决方案3】:

您需要在MyTemplate&lt;T&gt;::Inner 之前添加typename 关键字,因为MyTemplate&lt;T&gt; 是一个依赖范围。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-25
    • 2016-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多