Подтвердить что ты не робот

C2977: 'std:: tuple': слишком много аргументов шаблона (MSVC11)

Я пытаюсь создать googletest с Visual С++ 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 -file:

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

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

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

4b9b3361

Ответ 1

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

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

Они говорят, что у них есть исправление, чтобы снова включить значение по умолчанию.

Ответ 2

В 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, чтобы выбрать все проекты на С++ в своем решении

2) Свойства, C/С++, Препроцессор, Все конфигурации Все платформы, Определения препроцессора, <Edit>

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

_VARIADIC_MAX=10;

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

Ответ 3

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

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

Ответ 5

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

add_definitions(/D_VARIADIC_MAX=10)

Ответ 6

В Visual Studio 2013 std::tuple больше не использует _VARIADIC_MAX и теперь использует фактический variardic template s, поэтому эта проблема не исчезнет.

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

Ответ 7

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