web-dev-qa-db-fra.com

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

J'essaie de créer 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 du fichier utility-:

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

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

(BTW: j'ai essayé en vain de changer std::tr1::Tuple à std::Tuple)

40
Loom

Consultez cette entrée dans le blog msdn . VC++ 11 ne prend pas en charge les modèles variadic. Ils ont quelque chose qu'ils appellent des faux variadics. Faites défiler vers le bas et vous verrez un paragraphe sur les Faux variadics qui parle de tuples. Sur ce paragraphe, ils disent que le nombre maximum de paramètres 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). L'augmenter fera que le compilateur consommera plus de mémoire et vous obligera peut-être à utiliser l'option/Zm pour réserver plus d'espace aux PCH.

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

56
jmsu

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 vaut mieux mettre la macro à tous en

1) Maj cliquez pour sélectionner tous les projets C++ dans 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 nombre entre 6 et 10.

32
Jichao

Réglage GTEST_HAS_TR1_Tuple à 0 dans gtest.h aidé dans mon cas

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

10
Dmitry Ledentsov

Dans Visual Studio 2013, std::Tuple n'utilise plus _VARIADIC_MAX et utilise maintenant la variable réelle templates, donc ce problème devrait avoir disparu.

Si vous l'utilisez en 2013, cela signifie que vous incluez la mauvaise bibliothèque standard.

3

Ajoutez la ligne ci-dessous dans votre fichier cmake

add_definitions(/D_VARIADIC_MAX=10)
2
Validus Oculus

Pour utiliser GoogleTest dans Visual Studio 2012, vous devez définir _VARIADIC_MAX = 10 sous Propriétés-> C/C++ -> Preprocessor-> PreprocessorDefinitions 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

2
Praveer Kumar

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

2
Corey Kosak