我正在尝试使用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.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
的第72行 - 文件:
template<class = _Nil, _MAX_CLASS_LIST>
class tuple; // Line 72
std::tuple
有什么问题以及如何解决?
(顺便说一句:我尝试将std::tr1::tuple
更改为std::tuple
,但未成功
答案 0 :(得分:56)
在msdn blog中查看此条目。 VC ++ 11不支持可变参数模板。他们有一些他们称为人造变种的东西。向下滚动,你会看到一个关于Faux variadics的段落,它讨论了元组。在该段落上,他们说默认的最大参数数量为5.您可以将其增加到10:
您可以在项目范围内定义5到10之间的_VARIADIC_MAX(默认为5)。增加它会使编译器消耗更多内存,并且可能需要使用/ Zm选项为PCHes保留更多空间。
他们说他们有一个修复传入,再次使默认值为10。
答案 1 :(得分:31)
在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项目包含<tuple>
,最好将宏设置为全部
1)按住Shift键以选择解决方案中的所有C ++项目
2)属性,C / C ++,预处理器,所有配置所有平台,预处理器定义,<Edit>
3)在<different options>
行之前添加
_VARIADIC_MAX=10;
您可以将10更改为6~10中的任何数字。
答案 2 :(得分:10)
在gtest.h中将GTEST_HAS_TR1_TUPLE
设置为0 在我的案例中有所帮助
更新:当然,较少侵入的方法是定义预编译器标志GTEST_HAS_TR1_TUPLE = 0。检查有关_VARIADIC_MAX=10
的答案 - 解决问题的另一半问题。
答案 3 :(得分:2)
这在版本r675中已修复。见https://code.google.com/p/googletest/source/detail?r=675
答案 4 :(得分:2)
将以下行添加到您的cmake文件中
add_definitions(/D_VARIADIC_MAX=10)
答案 5 :(得分:2)
在Visual Studio 2013中,std::tuple
不再使用_VARIADIC_MAX
,现在使用实际的变量template
,因此这个问题应该消失。
如果您在2013年遇到它,则意味着您包含了错误的标准库。
答案 6 :(得分:2)
要在Visual Studio 2012中使用GoogleTest,您应该在使用它的项目的Properties-&gt; C / C ++ - &gt; Preprocessor-&gt; PreprocessorDefinitions下设置_VARIADIC_MAX = 10。 否则你可能会遇到以下错误 错误C2977:&#39; std :: tuple&#39; :模板参数太多