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
に変更しようとして失敗しました)
msdn blog のこのエントリを確認してください。 VC++ 11は可変長テンプレートをサポートしていません。彼らは、フェイクヴァラディックスと呼ばれるものを持っています。下にスクロールすると、タプルについて話すFaux variadicsの段落が表示されます。その段落では、デフォルトのパラメーターの最大数は5であると述べています。10に増やすことができます。
_VARIADIC_MAXプロジェクト全体で5〜10の範囲で定義できます(デフォルトは5です)。それを増やすと、コンパイラはより多くのメモリを消費し、PCHe用により多くのスペースを確保するために/ Zmオプションを使用する必要があるかもしれません。
彼らは、デフォルトの10を再び作るための修正が入っていると言います。
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)ソリューション内のすべてのC++プロジェクトを選択するには、Shiftキーを押しながらクリックします
2)プロパティ、C/C++、プリプロセッサ、すべての構成、すべてのプラットフォーム、プリプロセッサ定義、<Edit>
3)<different options>
行の前に追加します
_VARIADIC_MAX=10;
10を6〜10の任意の数に変更できます。
GTEST_HAS_TR1_Tuple
を0に設定 gtest.hで 私の場合に助けた
更新:もちろん、あまり邪魔にならない方法は、プリコンパイラフラグGTEST_HAS_TR1_Tuple = 0を定義することです。 _VARIADIC_MAX=10
に関する回答を確認してください-問題のもう半分を解決します。
Visual Studio 2013では、std::Tuple
で_VARIADIC_MAX
が使用されなくなり、実際にさまざまなtemplate
sが使用されるようになったため、この問題は解消されました。
2013年に問題が発生した場合は、間違った標準ライブラリが含まれていることを意味します。
以下の行をcmakeファイルに追加します
add_definitions(/D_VARIADIC_MAX=10)
Visual Studio 2012でGoogleTestを使用するには、それを使用するプロジェクトの[プロパティ]-> [C/C++]-> [プリプロセッサ]-> [プリプロセッサ定義]で_VARIADIC_MAX = 10を設定する必要があります。それ以外の場合、以下のエラーエラーC2977が発生する可能性があります: 'std :: Tuple':テンプレート引数が多すぎます
これはバージョンr675で修正されています。 https://code.google.com/p/googletest/source/detail?r=675 を参照してください