在模板方法上编译错误,返回是来自内部类的实例

lam*_*dae 16 c++ templates

这是一个简化的例子:

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

template<typename T>
MyTemplate<T>::Inner  MyTemplate<T>::met()
{ }
Run Code Online (Sandbox Code Playgroud)

我收到以下编译错误:

expected constructor, destructor, or type conversion before 'met'
Run Code Online (Sandbox Code Playgroud)

我用GCC.似乎编译器不能识别MyTemplate<T>::Inner为正确的类.我怎样才能解决这个问题?我试过在typename这里和那里坚持使用关键字无济于事.现在,我可以设法编译它的唯一方法是在类声明中内联方法定义,我想避免.

Mic*_*ice 29

Clang报告如下:

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

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

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

template<typename T>
typename MyTemplate<T>::Inner  MyTemplate<T>::met()
{ }
Run Code Online (Sandbox Code Playgroud)

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

  • 虽然这回答了这个问题,但如果你给提问者一个暗示依赖名字的暗示以及为什么那么相关,那就太好了. (8认同)

Pra*_*ian 11

返回类型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();
}
Run Code Online (Sandbox Code Playgroud)