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
)
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.
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.
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.
Dans Visual Studio 2013, std::Tuple
n'utilise plus _VARIADIC_MAX
et utilise maintenant la variable réelle template
s, donc ce problème devrait avoir disparu.
Si vous l'utilisez en 2013, cela signifie que vous incluez la mauvaise bibliothèque standard.
Ajoutez la ligne ci-dessous dans votre fichier cmake
add_definitions(/D_VARIADIC_MAX=10)
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
Ceci est corrigé dans la version r675. Voir https://code.google.com/p/googletest/source/detail?r=675