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

Nested template class syntax error (MSVC)

本文关键字:MSVC 错误 语法 嵌套      更新时间:2023-10-16

我正在使用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
}

这会产生一组错误(大部分来自后续代码):

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

它也会影响后面的代码,之后的所有行都会出现大量的语法错误。

是我没有看到什么东西还是这可能是Visual Studio的问题?

问题/解决方案

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

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

但是为什么呢?

模板名是依赖于的模板名时,我们需要使用template关键字,没有它,编译器会将Foo<R, S...>::Bar中的Bar视为非模板,这是没有意义的;它会出错。

进一步阅读:

  • 在哪里,为什么我必须把"模板"answers"typename"关键字?