嵌套模板类语法错误 (MSVC)

Cro*_*mon 3 c++ templates visual-c++

我正在使用 Visual Studio 2013,并且在模板外部类中返回嵌套模板类的函数遇到一些问题。我做了一个最小的例子,真正的例子涉及更多的代码:

template<typename R, typename... S>
class Foo
{
public:
    template<typename T>
    class Bar
    {

    };
};

template<typename T, typename R, typename... S>
typename Foo<R, S...>::Bar<T> fooBar() { // <--- LINE 33

}
Run Code Online (Sandbox Code Playgroud)

这会产生一整套错误(主要来自后续代码):

  • 33:错误C2988:无法识别的模板声明/定义
  • 33: 错误 C2059: 语法错误: '<'

而且它还会影响后续代码,之后的所有行都会出现大量语法错误。

我没有看到什么或者这可能是 Visual Studio 的问题吗?

Fil*_*efp 5

问题/解决方案

\n\n

您需要template在这种情况下使用关键字来告诉编译器这Bar确实是一个模板,如下面的代码片段所示:

\n\n
template<typename T, typename R, typename... S>\ntypename Foo<R, S...>::template Bar<T> fooBar() { // <--- LINE 33\n   ...\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

但为什么?

\n\n

每当模板名称依赖模板名称template时,我们都需要使用关键字,如果没有它,编译器将把in视为非模板,这是没有意义的;它会出错。BarFoo<R, S...>::Bar

\n\n

进一步阅读:

\n\n\n