C2977:“std :: tuple”:太多的模板参数(MSVC11)

我试图用Visual C ++ 11build立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.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' 

还有utility -file的第72行:

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

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

(顺便说一句:我试图将std::tr1::tuple更改为std::tuple失败)

在msdn博客中查看这个条目。 VC ++ 11不支持可变参数模板。 他们有一些他们称之为虚拟variables的东西。 向下滚动,你会看到一个关于元组variables的段落。 在那一段他们说默认的最大参数数是5.你可以把它增加到10:

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

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

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

 #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项目在解决scheme中包含<tuple> ,最好将macros设置为all

1)按住Shift键,select解决scheme中的所有C ++项目

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

3)在<different options>之前添加一行

 _VARIADIC_MAX=10; 

您可以在6〜10之间更改10。

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

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

这在r675版本中是固定的。 请参阅https://code.google.com/p/googletest/source/detail?r=675

将下面的行添加到您的cmake文件中

 add_definitions(/D_VARIADIC_MAX=10) 

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

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

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