41

我正在尝试使用 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-file的第72行:

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

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

(顺便说一句:我尝试更改std::tr1::tuple为未成功std::tuple

4

7 回答 7

56

在msdn 博客中查看此条目。VC++11 不支持可变参数模板。他们有一些他们称之为人造可变参数的东西。向下滚动,你会看到一个关于 Faux variadics 的段落,它讨论了元组。在该段落中,他们说默认的最大参数数为 5。您可以将其增加到 10:

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

他们说他们有一个修复程序可以再次将默认值设为 10。

于 2011-11-25T22:20:38.663 回答
34

在 Visual Studio 2012 (VC11)_VARIADIC_MAX中默认定义为 5 in header <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>,最好将宏设置为全部

1) Shift 单击以选择解决方案中的所有 C++ 项目

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

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

_VARIADIC_MAX=10;

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

于 2013-03-07T23:28:16.663 回答
10

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

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

于 2012-09-22T08:42:48.660 回答
3

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

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

于 2014-08-08T15:32:32.060 回答
2

这在 r675 版本中已修复。请参阅https://code.google.com/p/googletest/source/detail?r=675

于 2014-01-13T23:21:09.490 回答
2

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

add_definitions(/D_VARIADIC_MAX=10)
于 2014-05-23T11:04:43.107 回答
2

要在 Visual Studio 2012 中使用 GoogleTest,您应该在使用它的项目的 Properties->C/C++->Preprocessor->PreprocessorDefinitions 下设置 _VARIADIC_MAX=10。否则您可能会遇到以下错误 error C2977: 'std::tuple' : too many template arguments

于 2015-05-16T09:19:15.507 回答