【问题标题】:Nested template class syntax error (MSVC)嵌套模板类语法错误 (MSVC)
【发布时间】:2014-05-27 17:04:00
【问题描述】:

我正在使用 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 的问题吗?

【问题讨论】:

标签: c++ templates visual-c++


【解决方案1】:

问题/解决方案

你需要在这个上下文中使用关键字template来告诉编译器Bar确实是一个模板,如下面的sn-p:

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

但是为什么?

每当模板名称依赖的模板名称时,我们都需要使用template关键字,没有它,编译器将在Foo&lt;R, S...&gt;::Bar中处理Bar作为一个非模板,这是没有意义的;它会出错。

进一步阅读:

【讨论】:

  • 我认为你应该在函数中添加return typename Foo&lt;R, S...&gt;::template Bar&lt;T&gt;();这行来完成示例。
  • @RSahu 我们不知道Bar&lt;T&gt; 是否默认可构造,而是我在示例中添加了... 以表明函数的内容是遗漏(有意)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-06
相关资源
最近更新 更多