web-dev-qa-db-fra.com

déclaration de modèle de `typedef typename Foo <T> :: Bar Bar '

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?

22
geraldCelente

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
32
Kerrek SB

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;
7
Praetorian

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;
}
7
Dietmar Kühl

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.

0
schenken