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  void PrintTo(const ::std::tr1::tuple& 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 d’ utility -file:

 template class tuple; // Line 72 

Quel est le problème avec std::tuple et comment y remédier?

(BTW: Je tente sans succès de changer std::tr1::tuple en std::tuple )

Découvrez cette entrée dans le blog msdn . VC ++ 11 ne prend pas en charge les modèles variadiques. Ils ont quelque chose qu’ils appellent faux variadics. Faites défiler vers le bas et vous verrez un paragraphe sur Faux variadics qui parle de tuples. Sur ce paragraphe, ils disent que le nombre maximum de parameters par défaut est 5. Vous pouvez l’augmenter à 10:

Vous pouvez définir _VARIADIC_MAX à l’échelle du projet entre 5 et 10 inclus (la valeur par défaut est 5). Si vous l’augmentez, le compilateur consumra plus de mémoire et vous devrez peut-être utiliser l’option / Zm pour réserver davantage d’espace aux PCH.

Ils disent qu’ils ont un correctif entrant pour rendre le 10 par défaut à nouveau.

Dans Visual Studio 2012 (VC11), _VARIADIC_MAX est défini par défaut sur 5 dans l’en-tête :

 #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 à inclure dans une solution, il est préférable de définir la macro sur tout par

1) Cliquez 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 de préprocesseur,

3) append avant une ligne

 _VARIADIC_MAX=10; 

Vous pouvez changer 10 en n'importe quel nombre en 6 ~ 10.

Mettre GTEST_HAS_TR1_TUPLE à 0 dans gtest.h a aidé dans mon cas

Mise à jour: bien sûr, le moyen le moins intrusif est de définir un indicateur de précompilateur GTEST_HAS_TR1_TUPLE = 0. Vérifiez les réponses à propos de _VARIADIC_MAX=10 – résout une autre moitié du problème.

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

Ajouter la ligne ci-dessous dans votre fichier cmake

 add_definitions(/D_VARIADIC_MAX=10) 

Dans Visual Studio 2013, std::tuple n’utilise plus _VARIADIC_MAX et utilise désormais un template variable réel, ce qui fait que ce problème doit disparaître.

Si vous le rencontrez en 2013, cela signifie que vous incluez la mauvaise bibliothèque standard.

Pour utiliser GoogleTest dans Visual Studio 2012, vous devez définir _VARIADIC_MAX = 10 sous Propriétés-> C / C ++ -> Préprocesseur-> PréprocesseurDéfinitions sur les projets qui l’utilisent. sinon, vous pourriez rencontrer l’erreur d’erreur C2977 ci-dessous: ‘std :: tuple’: trop d’arguments de modèle