2010-10-13 5 views
1

simplificatrices Héritier mon problème, nous pouvons considérer:g ++ typedef modèles en classe

template <class T> 
class Base{ 
    typedef typename std::pair<T, T> pair; 
}; 

template <class T> 
class Inheritor : public Base<T> { 
    pair *p;       
    // mean that we want to use constructor of std::pair. 
    // say: std::pair withou argument list 

    Inheritor<T>::pair *p; 
    // dont see his typename 
    // say: pair does not name a type 

    typename pair *p; 
    // I was sure that it works. 
    // I dont know why it doesnt work. 
    // say: expected nested-name-specifier before 'pair 

    typename Inheritor<T>::pair *p; 
    // ok! 
}; 

pourquoi nous ne pouvons pas écrire typename paire * p? Je ne comprends pas les raisons de Inheritor ::! ça rend le code plus complexe et mauvais à lire!

PS (du public cource. Ce que je dis "simplifier mon problème ...")

typedef typename Base<T>::pair pair; 

Dans mon esprit, il est un ... russe mot qui est difficile à traduire ("костыль")

ressembler bidouille ou du ruban adhésif ou pirater =)

Si je comprends bien:

typedefs hériteront comme d'habitude fonction ou variable. mais ce n'est pas accessible (!!!). à Acess il nous faut écrire

typedef typename Base<T>::pair pair; 

ou

typedef typename Inheritor<T>::pair pair; 

il ressemble drôle Hindu code mais nous en a besoin! (> _ <) « » « »

Evidement, portée publique

Répondre

3

Quand un nom de type dépend d'un paramètre de modèle, il est un nom dépendant . You have to use typename to indicate you're naming a type. Lisez cet article, et vous verrez que votre utilisation de typename n'a pas de sens, sauf dans le dernier cas.

Voilà comment votre code devrait probablement:

template <class T> 
class Base 
{ 
public: // you probably don't want a private typedef 
    typedef std::pair<T, T> pair; // typename isn't needed here, this isn't dependent 
}; 

template <class T> 
class Inheritor : public Base<T> 
{ 
public: // public again 
    typedef typename Base<T>::pair pair; // get the Base's pair type, typedef it 

    pair *p; // ah, easy to use 
};