C2977:'std :: tuple':模板参数太多(MSVC11)

Loo*_*oom 40 c++ tuples variadic-templates c++11 visual-studio-2012

我正在尝试使用Visual C++ 11构建googletest,但是下面的代码会导致错误

template <typename T1, typename T2, typename T3, typename T4, typename T5,
          typename T6, typename T7, typename T8, typename T9>
void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9>& t, // <-- error C2977
             ::std::ostream* os) {
  PrintTupleTo(t, os);
}
Run Code Online (Sandbox Code Playgroud)

这是一个错误文本:

f:\gtest-1.6.0\include\gtest\gtest-printers.h(550): error C2977: 'std::tuple' : too many template arguments
  c:\program files (x86)\microsoft visual studio 11.0\vc\include\utility(72) : see declaration of 'std::tuple'
Run Code Online (Sandbox Code Playgroud)

并且有utility-file 的第72行:

template<class = _Nil, _MAX_CLASS_LIST>
   class tuple; // Line 72
Run Code Online (Sandbox Code Playgroud)

有什么问题std::tuple以及如何解决?

(顺便说一句:我曾尝试改变std::tr1::tuplestd::tuple)

jms*_*msu 56

msdn博客中查看此条目.VC++ 11不支持可变参数模板.他们有一些他们称为人造变种的东西.向下滚动,你会看到一个关于Faux variadics的段落,它讨论了元组.在该段落上,他们说默认的最大参数数量为5.您可以将其增加到10:

您可以在5到10之间的项目范围内定义_VARIADIC_MAX(默认为5).增加它会使编译器消耗更多内存,并且可能需要使用/ Zm选项为PCHes保留更多空间.

他们说他们有一个修复传入,再次使默认值为10.

  • 他们应该只实现可变参数模板,而不是修复因设计而破坏的东西. (14认同)
  • @ruvenvb产品开发具有一定的发展势头.Visual Studio 2012在开发开发时正确实现了标准草案.然后,C++草案发生了变化.C++ 11标准于2011年8月(MSDN博客文章发布前一个月)发布,当时在产品周期中为了重新实现和重新测试一个非常复杂的功能(如可变参数模板)有点太晚了.我的观点是"当标准刚刚改变(或尚未发布)时,不要将产品归咎于"非标准"功能实现." (2认同)

Jic*_*hao 32

在Visual Studio 2012(VC11)_VARIADIC_MAX中,默认情况下在头文件中定义为5 <xstddef>:

#if !defined(_VARIADIC_MAX)
 #define _VARIADIC_MAX  5

#elif _VARIADIC_MAX < 5 || 10 < _VARIADIC_MAX
 #error _VARIADIC_MAX must be between 5 and 10, inclusive
#endif /* !defined(_VARIADIC_MAX) */
Run Code Online (Sandbox Code Playgroud)

如果您<tuple>在解决方案中包含多个VC11项目,则最好将宏设置为all

1)按住Shift键以选择解决方案中的所有C++项目

2)属性,C/C++,预处理器,所有配置所有平台,预处理器定义, <Edit>

3)<different options>连续添加

_VARIADIC_MAX=10;
Run Code Online (Sandbox Code Playgroud)

您可以将10更改为6~10中的任意数字.

  • http://blogs.msdn.com/b/vcblog/archive/2013/06/28/c-11-14-stl-features-fixes-and-breaking-changes-in-vs-2013.aspx我们降低了无穷大在Visual C++ 2012中从10到5,以便改善大多数用户的编译时间(我们提供了一种通过宏请求旧限制10的方法,_VARIADIC_MAX).在Visual C++ 2013中,我们彻底根除了虚假的可变参数宏.如果你想要50种类型的元组,你现在就可以拥有它们.此外,我很高兴地宣布将STL切换到真正的可变参数模板已经改进了编译时间并减少了编译器内存消耗. (4认同)
  • 并且不要忘记添加分号_VARIADIC_MAX = 10; (3认同)

Dmi*_*sov 10

在我的情况下,在gtest.h中设置GTEST_HAS_TR1_TUPLE为0 帮助

更新:当然,较少侵入的方法是定义预编译器标志GTEST_HAS_TR1_TUPLE = 0.检查答案_VARIADIC_MAX=10- 解决另一半问题.