C2977: 'std :: tuple': слишком много аргументов шаблона (MSVC11) - PullRequest
40 голосов
/ 26 ноября 2011

Я пытаюсь собрать googletest с Visual C ++ 11, но следующий код вызывает ошибку

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'

И есть строка 72из utility -файла:

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

В чем проблема с std::tuple и как ее исправить?

(Кстати: я безуспешно пытался изменить std::tr1::tuple наstd::tuple)

Ответы [ 7 ]

56 голосов
/ 26 ноября 2011

Проверьте эту запись в блоге msdn .VC ++ 11 не имеет поддержки шаблонов с переменными параметрами.У них есть то, что они называют искусственными вариагами.Прокрутите вниз, и вы увидите параграф о Faux variadics, который говорит о кортежах.В этом параграфе говорится, что максимальное количество параметров по умолчанию равно 5. Вы можете увеличить его до 10:

. Вы можете определить _VARIADIC_MAX для всего проекта в диапазоне от 5 до 10 включительно (по умолчанию это 5).Увеличение его приведет к тому, что компилятор будет потреблять больше памяти, и может потребовать от вас использования параметра / Zm, чтобы зарезервировать больше места для PCH.

31 голосов
/ 08 марта 2013

В Visual Studio 2012 (VC11) _VARIADIC_MAX по умолчанию определяется как 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>

3) добавить перед <different options> строку

_VARIADIC_MAX=10;

Вы можете изменить 10 на любое число в 6 ~ 10.

10 голосов
/ 22 сентября 2012

Установка GTEST_HAS_TR1_TUPLE в 0 в gtest.h помогла в моем случае

Обновление: конечно, менее навязчивым способом является определение флага прекомпилятора GTEST_HAS_TR1_TUPLE = 0.Проверьте ответы о _VARIADIC_MAX=10 - решает еще одну половину вопроса.

2 голосов
/ 16 мая 2015

Чтобы использовать GoogleTest в Visual Studio 2012, вы должны установить _VARIADIC_MAX = 10 в Свойства-> C / C ++ -> Preprocessor-> PreprocessorDefinitions для проектов, которые его используют. иначе вы можете столкнуться с ошибкой ниже ошибка C2977: 'std :: tuple': слишком много аргументов шаблона

2 голосов
/ 08 августа 2014

В Visual Studio 2013 std::tuple больше не использует _VARIADIC_MAX и теперь использует действительные переменные template с, поэтому эту проблему следует устранить.

Если вы столкнетесь с ней в 2013 году, это означает, чтовы включаете не ту стандартную библиотеку.

2 голосов
/ 23 мая 2014

Добавьте строку ниже в ваш файл cmake

add_definitions(/D_VARIADIC_MAX=10)
2 голосов
/ 14 января 2014

Это исправлено в версии r675. Смотри https://code.google.com/p/googletest/source/detail?r=675

...