C2977: 'std::元组' : 模板参数过多 (MSVC11)

C2977: 'std::tuple' : too many template arguments (MSVC11)

本文关键字:MSVC11 std 元组 C2977 参数      更新时间:2023-10-16

我正在尝试用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);
}

这是一个错误文本:

f:gtest-1.6.0includegtestgtest-printers.h(550): error C2977: 'std::tuple' : too many template arguments
  c:program files (x86)microsoft visual studio 11.0vcincludeutility(72) : see declaration of 'std::tuple'

还有utility -file的第72行:

template<class = _Nil, _MAX_CLASS_LIST>
   class tuple; // Line 72

std::tuple的问题是什么,如何解决它?

(BTW:我试图将std::tr1::tuple更改为std::tuple失败)

查看msdn博客中的这篇文章。vc++ 11不支持可变模板。他们有所谓的伪变量。向下滚动,你会看到一个关于伪变量的段落,讨论元组。在那一段中,他们说默认的最大参数数是5。你可以把它增加到10:

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

他们说他们有一个修复程序来重新设置默认的10

在Visual Studio 2012 (VC11)中,_VARIADIC_MAX默认定义为标题<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) */

如果您有多个VC11项目在解决方案中包含<tuple>,则最好通过

将宏设置为all。

1) Shift键点击选择解决方案中的所有c++项目

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

3) add before <different options> a row

_VARIADIC_MAX=10;

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

在gtest.h中将GTEST_HAS_TR1_TUPLE设置为0 对我的情况有帮助

更新:当然,侵入性较小的方法是定义一个预编译器标志GTEST_HAS_TR1_TUPLE=0。查看_VARIADIC_MAX=10的答案-解决了另外一半的问题

在Visual Studio 2013中,std::tuple不再使用_VARIADIC_MAX,现在使用实际的可变template s,所以这个问题应该消失了。

如果你在2013年遇到它,这意味着你包含了错误的标准库。

在r675版本中修复。见https://code.google.com/p/googletest/source/detail?r=675

添加下面一行到你的cmake文件

add_definitions(/D_VARIADIC_MAX=10)

要在Visual Studio 2012中使用GoogleTest,您应该在使用它的项目的Properties->C/c++ ->Preprocessor->PreprocessorDefinitions下设置_VARIADIC_MAX=10。否则你可能会遇到下面的错误错误C2977: 'std::tuple':模板参数太多