关于C++:在模板方法上编译错误,从内部类返回实例

Compiling error on template method, return is instance from inner class

本问题已经有最佳答案,请猛点这里访问。

下面是一个简单的例子:

1
2
3
4
5
6
7
8
9
10
template<typename T>
class MyTemplate
{
  class Inner {};
  Inner met();
};

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

我得到以下编译错误:

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

我使用GCC。似乎编译器没有将MyTemplate::Inner识别为适当的类。我怎么修这个?我试过把typename关键字到处贴,但没有用。现在,我唯一能编译它的方法是在类声明中内联方法定义,我希望避免这种情况。


Clang报告如下:

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

typename放在适当的地方固定。

1
2
3
4
5
6
7
8
9
10
template<typename T>
class MyTemplate
{
  class Inner {};
  Inner met();
};

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

你把排字名放在正确的位置了吗?如果是这样,那么这一定是g++中的错误。


MyTemplate::met的返回类型是依赖名称,因此需要在它之前添加typename关键字。以下汇编在GCC-4.5.1上

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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();
}


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