2012-06-20 11 views
4

Paragraphe 7.3.3. des états standards 2003 C++ quiL'utilisation de la déclaration pour un membre de classe doit être une déclaration de membre (C++ 2003)

Using declaration for a class member shall be a member declaration.

Cela signifie que ce qui suit donne une erreur de syntaxe:

struct S1 
{ 
    static int var1; 
}; 

using S1::var1; 

Alors que le suivant compile bien:

namespace N2 
{ 
    int var2; 
} 

using N2::var2; 

Quelqu'un sait-il la raison d'être (le cas échéant) derrière cela?

Encore plus, la norme donne un exemple explicite avec des données statiques membre de la structure et dit qu'il devrait provoquer une erreur de syntaxe. MS C++ donne cette erreur:

cpptest1.cxx(9) : error C2885: 'S1::var1': not a valid using-declaration at non-class scope

Il n'est pas encore clair pourquoi cela devrait être interdit.

+3

Autre que _a struct is no namespace_? –

+0

Quel est le message de l'erreur de syntaxe? – kol

+0

Et quoi? Comment est-ce lié à la question? –

Répondre

0

La raison pour laquelle cela ne fonctionne pas est simplement parce que la norme l'interdit. Portez une attention particulière à s dans l'exemple:

enter image description here

Pour contourner ce problème, vous pouvez dire:

auto& var = S1::var; 

Faire la norme (et donc tous les compilateurs) plus compliqué à gérer un cas inhabituel a une solution de contournement pratique ne passe pas le test coût-bénéfice.

+0

La question n'était pas de savoir si cela fonctionne ou non. C'est limpide. S'il vous plaît, lisez attentivement le message initial. La question portait sur les raisons derrière la norme. Ce que vous dites dans votre dernière phrase n'est pas admissible pour une raison. Le texte pour C2885 indique que Microsoft émet cette erreur pour se conformer à la norme. Cela permet de s'attendre à ce que dans les versions antérieures, il n'y avait pas cette restriction. Et ce n'est pas surprenant. Supprimer cette restriction rend les choses plus simples. –

+0

@Kirill: Exiger un développeur de compilateur (Microsoft) pour supprimer le support de quelque chose qu'ils ont fait sans la bénédiction du comité est beaucoup moins cher que de demander à des centaines d'autres compilateurs d'ajouter du support. –

+0

Outre les compilateurs de poignée, je ne suis pas sûr que leur nombre est supérieur à 50, il y a des millions de développeurs. Chaque simplification de la définition de la langue réduit le temps d'apprentissage et la confusion. Multipliez ceci par le nombre de programmeurs C++. C'est le vrai bénéfice. –

Questions connexes