2017-04-04 2 views
1

Pourquoi le code C++ 11/14 suivant ne fonctionne-t-il pas? Ici, je suis en train de déclarer une énumération dans la classe. L'objectif n'est pas d'avoir une énorme - 100s de valeurs d'enums dans la classe - ce qui rend la classe illisible. Je ne peux pas utiliser une énumération distincte pour cela - pour des raisons politiques.En avant déclarez enum non chiffré dans la classe private

class A { 
public: 
    // forward declare the enum 
    enum B : int; 
    void func (B b) {} 
}; 

// The actual declaration 
enum A::B : int { 
    Val1, 
    Val2, 
}; 

int main() 
{ 
    // B is unscoped. so I should be able to use it as below? 
    int a = A::Val1; 
} 

erreur de compilation

tmp.cpp: In function ‘int main()’: 
tmp.cpp:13:5: error: ‘A::B Val1’ is private 
    Val1, 
    ^

tmp.cpp:19:16: error: within this context 
    int a = A::Val1; 
       ^

Mais le code suivant fonctionne:

int a = A::B::Val1; 
+0

Juste une pensée: Peut-être parce que le compilateur ne peut pas savoir que 'Val1' n'est pas déclarée dans plus d'un ENUM dans le cadre de' A' ou dérivé classes - et protège contre cette possibilité en le forçant à être privé. – Jeremy

Répondre

0

Cette erreur apparaît dans G ++ mais pas dans Visual C++ et clang. L'identifiant formellement enum peut être utilisé comme espace de noms, ou peut être ignoré, mais les deux derniers l'omettent par défaut, tandis que le dernier g ++ l'applique. C'est modifiable par les options du compilateur. Utilisation d'id classe ENUM est obligatoire:

class A { 
public: 
    // forward declare the enum 
    enum class B : int; 
    void func (B b) {} 
}; 

// The actual declaration 
enum class A::B : int { 
    Val1, 
    Val2, 
}; 

int main() 
{ 
    int a = static_cast<int>(A::B::Val1); // no implicit cast 
} 
+0

Je n'ai probablement pas reçu votre réponse complètement. 'int a = A :: B :: Val1;' fonctionne sans cast. Seulement que 'int a = A :: Val1;' ne fonctionne pas. Ce que je m'attends à travailler comme un enum_unscoped. 'int a = A :: Val1' fonctionne bien si je mets l'enum à l'intérieur de la classe elle-même à la place de la déclaration forward. Donc, mon doute est de savoir pourquoi cette différence de comportement. – MGH

+0

@MGH pour les classes enum étendues est obligatoire, pour les énumérations triviales, comme celle que vous utilisez, cela dépend du réglage du compilateur, pourquoi, je ne suis pas sûr. Peut-être est-il traité comme une classe enum par défaut? mais non, cela exigerait une distribution. Si je me souviens bien, g ++ avec un drapeau "permissif" permettra de le faire. – Swift