C2977: 'std::元组' : 模板参数过多 (MSVC11)
C2977: 'std::tuple' : too many template arguments (MSVC11)
我正在尝试用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.0includegtestgtest-printers.h(550): error C2977: 'std::tuple' : too many template arguments
c:program files (x86)microsoft visual studio 11.0vcincludeutility(72) : see declaration of 'std::tuple'
还有utility
-file的第72行:
template<class = _Nil, _MAX_CLASS_LIST>
class tuple; // Line 72
std::tuple
的问题是什么,如何解决它?
(BTW:我试图将std::tr1::tuple
更改为std::tuple
失败)
查看msdn博客中的这篇文章。vc++ 11不支持可变模板。他们有所谓的伪变量。向下滚动,你会看到一个关于伪变量的段落,讨论元组。在那一段中,他们说默认的最大参数数是5。你可以把它增加到10:
你可以在5到10之间定义_VARIADIC_MAX项目范围(默认为5)。增加它将使编译器消耗更多内存,并且可能需要你使用/Zm选项为pch保留更多空间。
他们说他们有一个修复程序来重新设置默认的10
在Visual Studio 2012 (VC11)中,_VARIADIC_MAX
默认定义为标题<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) add before <different options>
a row
_VARIADIC_MAX=10;
您可以将10更改为6~10中的任意数字
在gtest.h中将GTEST_HAS_TR1_TUPLE
设置为0 对我的情况有帮助
更新:当然,侵入性较小的方法是定义一个预编译器标志GTEST_HAS_TR1_TUPLE=0。查看_VARIADIC_MAX=10
的答案-解决了另外一半的问题
在Visual Studio 2013中,std::tuple
不再使用_VARIADIC_MAX
,现在使用实际的可变template
s,所以这个问题应该消失了。
如果你在2013年遇到它,这意味着你包含了错误的标准库。
在r675版本中修复。见https://code.google.com/p/googletest/source/detail?r=675
添加下面一行到你的cmake文件
add_definitions(/D_VARIADIC_MAX=10)
要在Visual Studio 2012中使用GoogleTest,您应该在使用它的项目的Properties->C/c++ ->Preprocessor->PreprocessorDefinitions下设置_VARIADIC_MAX=10。否则你可能会遇到下面的错误错误C2977: 'std::tuple':模板参数太多
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- std::具有相同基类的类的变体
- std::向量与传递值的动态数组
- 使用std::vector的OpenCL矩阵乘法
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- std::condition_variable::wait()如何评估给定的谓词
- 如何获取std::result_of函数的返回类型
- std::原子加载和存储都需要吗
- 将对象移动到std::shared_ptr
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 使用一个考虑到std::map中键值的滚动或换行的键
- 如何从 std::atomic 中提取指针 T<T>?
- 为什么 std::unique 不调用 std::sort?
- 在带有msvc11的静态类析构函数中使用std::system_category()
- C2977: 'std::元组' : 模板参数过多 (MSVC11)