C2977: 'std::tuple' : too many template ar

2019-01-21 12:54发布

I'm trying to build googletest with Visual C++ 11, but following code causes an error

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);
}

That's an error text:

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'

And there is the line 72 of utility-file:

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

What is the problem with std::tuple and how to fix it?

(BTW: I'm tried unsuccessfully to change std::tr1::tuple to std::tuple )

7条回答
姐就是有狂的资本
2楼-- · 2019-01-21 13:15

In Visual Studio 2013, std::tuple no longer uses _VARIADIC_MAX and now uses actual variardic templates, so this problem should be gone.

If you run into it in 2013, it means you are including the wrong standard library.

查看更多
你好瞎i
3楼-- · 2019-01-21 13:19
老娘就宠你
4楼-- · 2019-01-21 13:24

Add below line into your cmake file

add_definitions(/D_VARIADIC_MAX=10)
查看更多
叼着烟拽天下
5楼-- · 2019-01-21 13:29

Setting GTEST_HAS_TR1_TUPLE to 0 in gtest.h helped in my case

Update: of course, the less intrusive way is to define a precompiler flag GTEST_HAS_TR1_TUPLE=0. Check the answers about _VARIADIC_MAX=10 - solves another half of the issue.

查看更多
Anthone
6楼-- · 2019-01-21 13:35

In Visual Studio 2012 (VC11) _VARIADIC_MAX is by default defined as 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) */

if you have multiple VC11 projects include <tuple> in a solution, it is better to set the macro to all by

1) Shift click to select all C++ projects in your solution

2) Properties, C/C++, Preprocessor, All Configurations All Platforms, Preprocessor Definitions, <Edit>

3) add before <different options> a row

_VARIADIC_MAX=10;

You can change 10 to any number in 6~10.

查看更多
啃猪蹄的小仙女
7楼-- · 2019-01-21 13:36

Check out this entry in the msdn blog. VC++11 doesn't have support for variadic templates. They have something they call faux variadics. Scroll down and you will see a paragraph on Faux variadics that talks about tuples. On that paragraph they say the default maximum number of parameters is 5. You can increase it to 10:

You can define _VARIADIC_MAX project-wide between 5 and 10 inclusive (it defaults to 5). Increasing it will make the compiler consume more memory, and may require you to use the /Zm option to reserve more space for PCHes.

They say they have a fix incoming to make the default 10 again.

查看更多
登录 后发表回答