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
)
In Visual Studio 2013,
std::tuple
no longer uses_VARIADIC_MAX
and now uses actual variardictemplate
s, so this problem should be gone.If you run into it in 2013, it means you are including the wrong standard library.
This is fixed in version r675. See https://code.google.com/p/googletest/source/detail?r=675
Add below line into your cmake file
Setting
GTEST_HAS_TR1_TUPLE
to 0in gtest.hhelped in my caseUpdate: 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.In Visual Studio 2012 (VC11)
_VARIADIC_MAX
is by default defined as 5 in header<xstddef>
:if you have multiple VC11 projects include
<tuple>
in a solution, it is better to set the macro to all by1) 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 rowYou can change 10 to any number in 6~10.
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:
They say they have a fix incoming to make the default 10 again.