web-dev-qa-db-ja.com

C2977: 'std :: Tuple':テンプレート引数が多すぎます(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.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::Tuplestd::Tupleに変更しようとして失敗しました)

40
Loom

msdn blog のこのエントリを確認してください。 VC++ 11は可変長テンプレートをサポートしていません。彼らは、フェイクヴァラディックスと呼ばれるものを持っています。下にスクロールすると、タプルについて話すFaux variadicsの段落が表示されます。その段落では、デフォルトのパラメーターの最大数は5であると述べています。10に増やすことができます。

_VARIADIC_MAXプロジェクト全体で5〜10の範囲で定義できます(デフォルトは5です)。それを増やすと、コンパイラはより多くのメモリを消費し、PCHe用により多くのスペースを確保するために/ Zmオプションを使用する必要があるかもしれません。

彼らは、デフォルトの10を再び作るための修正が入っていると言います。

56
jmsu

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の任意の数に変更できます。

31
Jichao

GTEST_HAS_TR1_Tupleを0に設定 gtest.hで 私の場合に助けた

更新:もちろん、あまり邪魔にならない方法は、プリコンパイラフラグGTEST_HAS_TR1_Tuple = 0を定義することです。 _VARIADIC_MAX=10に関する回答を確認してください-問題のもう半分を解決します。

10

Visual Studio 2013では、std::Tuple_VARIADIC_MAXが使用されなくなり、実際にさまざまなtemplatesが使用されるようになったため、この問題は解消されました。

2013年に問題が発生した場合は、間違った標準ライブラリが含まれていることを意味します。

以下の行をcmakeファイルに追加します

add_definitions(/D_VARIADIC_MAX=10)
2
Validus Oculus

Visual Studio 2012でGoogleTestを使用するには、それを使用するプロジェクトの[プロパティ]-> [C/C++]-> [プリプロセッサ]-> [プリプロセッサ定義]で_VARIADIC_MAX = 10を設定する必要があります。それ以外の場合、以下のエラーエラーC2977が発生する可能性があります: 'std :: Tuple':テンプレート引数が多すぎます

2
Praveer Kumar

これはバージョンr675で修正されています。 https://code.google.com/p/googletest/source/detail?r=675 を参照してください

2
Corey Kosak