2010-10-21 5 views
2

Suivi sur une réponse de la nuit dernière - j'espérais que plus de commentaires répondraient pour moi mais pas de dés.typedef pour enum à partir de la classe

Existe-t-il un moyen d'y parvenir sans héritage qui ne nécessite pas l'utilisation fastidieuse dans l'avant-dernière ligne de code ci-dessous, qui écrit la valeur à cout?

struct A { 
    enum E { 
     X, Y, Z 
    }; 
}; 

template <class T> 
struct B { 
    typedef typename T::E E; 
}; 

// basically "import" the A::E enum into B. 
int main(void) 
{ 
    std::cout << B<A>::E::X << std::endl; 
    return 0; 
} 

Répondre

2

La seule façon de placer les noms enum noms de valeur directement dans une classe, est en héritant d'une classe avec ces noms.

Le code que vous montrez semble utiliser une extension de langage Microsoft.

En C de 98 un enum typename ne peut pas être utilisé pour qualifié l'un des noms de valeur:

 
Comeau C/C++ 4.3.10.1 (Oct 6 2008 11:28:09) for ONLINE_EVALUATION_BETA2 
Copyright 1988-2008 Comeau Computing. All rights reserved. 
MODE:strict errors C++ C++0x_extensions 

"ComeauTest.c", line 17: error: name followed by "::" must be a class or namespace 
      name... Wild guess: Did you #include the right header? 
     std::cout << B<A>::E::X << std::endl; 
         ^

1 error detected in the compilation of "ComeauTest.c". 

Au lieu de ...

typedef typename T::E E; 

... faire .. .

typedef T E; 

Vive & HTH.,

+0

oui c'est Microsoft C++ dans VS2010, ajouté ce tag au q –

+0

lorsque je fais le changement suggéré, la ligne 'cout' ne compile pas. erreur C2039: 'X': n'est pas membre du 'B ' avec [ T = A ] –

+1

@ Steve: non, il devrait fonctionner avec l'utilisation originale (juste un changement du typedef). Si vous voulez que les valeurs 'X' soient directement disponibles sans qualification, vous devrez les hériter. Comme dans la réponse de Steve. Mais je pense qu'à la fin vous ne voudriez pas faire ça. "A la fin" → peut-être des années à venir ... ;-) Salutations & hth. –

3

Cela aide-t-il?

struct A { 
    enum E { 
     X, Y, Z 
    }; 
}; 

template <class T> 
struct B : private T{ // private inheritance. 
public: 
    using T::X; 
}; 

// basically "import" the A::E enum into B. 
int main(void) 
{ 
    B<A>::X;    // Simpler now? 
    return 0; 
} 
+0

Tout moyen de le faire sans héritage? –

+0

pourquoi, quel problème l'héritage * privé * cause-t-il? –

Questions connexes