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

时间:2011-11-25 21:56:52

标签: c++ visual-studio-2012 c++11 tuples variadic-templates

我正在尝试使用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,但未成功

7 个答案:

答案 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)

答案 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; :模板参数太多