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”:太多的模板参数