40 votes

C2977 : 'std::tuple' : trop d'arguments de modèle (MSVC11)

J'essaie de construire googletest avec Visual C++ 11, mais le code suivant provoque une erreur

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);
}

C'est un texte d'erreur :

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'

Et il y a la ligne 72 de utility -fichier :

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

Quel est le problème avec std::tuple et comment le réparer ?

(BTW : J'ai essayé sans succès de changer std::tr1::tuple a std::tuple )

56voto

jmsu Points 1492

Découvrez cette entrée dans la msdn blog. VC++11 n'est pas prise en charge pour les variadic templates. Ils ont quelque chose qu'ils appellent faux variadics. Faites défiler vers le bas et vous verrez un paragraphe sur les Faux variadics qui parle de tuples. Sur ce point, ils disent la valeur par défaut nombre maximal de paramètres est de 5. Vous pouvez l'augmenter à 10:

Vous pouvez définir _VARIADIC_MAX à l'échelle du projet entre 5 et 10 inclus (valeur par défaut 5). En augmentant il fera le compilateur consomment plus de mémoire, et peut vous obliger à utiliser l'option /Zm pour réserver plus d'espace pour les PCHes.

Ils disent qu'ils ont un correctif entrant à rendre la valeur par défaut 10.

32voto

Jichao Points 476

Dans Visual Studio 2012 (VC11) _VARIADIC_MAX est par défaut défini comme 5 dans l'en-tête <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) */

si vous avez plusieurs projets VC11, incluez <tuple> dans une solution, il est préférable de définir la macro à tous par

1) Cliquez avec la touche Shift pour sélectionner tous les projets C++ de votre solution.

2) Propriétés, C/C++, Préprocesseur, Toutes les configurations Toutes les plates-formes, Définitions du préprocesseur, <Edit>

3) ajouter avant <different options> une rangée

_VARIADIC_MAX=10;

Vous pouvez remplacer 10 par n'importe quel chiffre entre 6 et 10.

10voto

Dmitry Ledentsov Points 1778

Réglage de GTEST_HAS_TR1_TUPLE à 0 dans gtest.h a aidé dans mon cas

Mise à jour : bien sûr, la méthode la moins intrusive consiste à définir un drapeau de précompilation GTEST_HAS_TR1_TUPLE=0. Consultez les réponses sur les sujets suivants _VARIADIC_MAX=10 - résout une autre moitié du problème.

2voto

Corey Kosak Points 1957

Ceci est corrigé dans la version r675. Voir https://code.google.com/p/googletest/source/detail?r=675

2voto

Murat Karakuş Points 130

Ajoutez la ligne suivante dans votre fichier cmake

add_definitions(/D_VARIADIC_MAX=10)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X