Je rencontre de grandes difficultés pour déclarer un type basé sur un modèle comme indiqué ci-dessous.
#include <cstdlib>
#include <iostream>
using namespace std;
template <class T>
class Foo
{
typedef T Bar;
};
template <class T>
typedef typename Foo<T>::Bar Bar;
int main(int argc, char *argv[])
{
Bar bar;
Foo<int> foo;
system("PAUSE");
return EXIT_SUCCESS;
}
Je reçois une erreur
template declaration of `typedef typename Foo<T>::Bar Bar'
sur la ligne
template <class T>
typedef typename Foo<T>::Bar Bar;
Je le fais parce que je veux éviter d'écrire typename Foo :: Bar dans mon code.
Qu'est-ce que je fais mal?
La déclaration typedef
en C++ ne peut pas être un modèle. Toutefois, C++ 11 a ajouté une syntaxe alternative utilisant la déclaration using
pour autoriser les alias de types paramétrés:
template <typename T>
using Bar = typename Foo<T>::Bar;
Maintenant vous pouvez utiliser:
Bar<int> x; // is a Foo<int>::Bar
typedef
's ne peuvent pas être des modèles. C’est exactement la raison pour laquelle C++ 11 a inventé les alias templates. Essayer
template <class T>
using Bar = typename Foo<T>::Bar;
Vous ne pouvez pas typedef
un modèle. Cependant, vous pouvez utiliser un modèle d'alias. Le code ci-dessous illustre l'utilisation et corrige quelques autres problèmes:
template <class T>
class Foo
{
public:
typedef T Bar;
};
template <class T>
using Bar = typename Foo<T>::Bar;
int main(int argc, char *argv[])
{
Bar<int> bar;
Foo<int> foo;
}
J'espère que c'est correct d'ajouter des réponses tardives ...
J'utilise toujours VS2012, qui ne semble pas implémenter de modèles d'alias. J'ai donc eu recours à ce mélange pour mes besoins:
//map<CWinThread*, AKTHREADINFO<T> > mapThreads; // won't compile
#define MAP_THREADS(T) map<CWinThread*, AKTHREADINFO<T> >
...
MAP_THREADS(T) mapThreads;
Désolé, cela ne montre pas l'exemple original, mais vous obtenez la dérive.