41

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)

4

7 に答える 7

56

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

プロジェクト全体で _VARIADIC_MAX を 5 から 10 の間で定義できます (デフォルトは 5 です)。この値を大きくすると、コンパイラがより多くのメモリを消費するようになり、/Zm オプションを使用して PCHes 用により多くの領域を予約することが必要になる場合があります。

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

于 2011-11-25T22:20:38.663 に答える
34

Visual Studio 2012 (VC11)_VARIADIC_MAXでは、既定で header に 5 として定義されています<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>

<different options>3)行の前に追加

_VARIADIC_MAX=10;

10 は 6~10 の任意の数字に変更できます。

于 2013-03-07T23:28:16.663 に答える
10

gtest.hGTEST_HAS_TR1_TUPLEで 0に設定すると、私の場合は役に立ちました

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

于 2012-09-22T08:42:48.660 に答える
2

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

add_definitions(/D_VARIADIC_MAX=10)
于 2014-05-23T11:04:43.107 に答える
2

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

于 2014-01-13T23:21:09.490 に答える
2

Visual Studio 2012 で GoogleTest を使用するには、それを使用するプロジェクトの Properties->C/C++->Preprocessor->PreprocessorDefinitions で _VARIADIC_MAX=10 を設定する必要があります。そうしないと、以下のエラー error C2977: 'std::tuple' : too many template arguments が発生する可能性があります

于 2015-05-16T09:19:15.507 に答える