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
)
Ответы
Ответ 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
- решает еще одну проблему.
Ответ 4
Это исправлено в версии r675. См. https://code.google.com/p/googletest/source/detail?r=675
Ответ 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': слишком много аргументов шаблона