2015-07-18 24 views
16

Considerare il seguente programma. E 'ben formata o meno secondo lo standard C++ (i riferimenti alle parti rilevanti della norma necessarie):Tentativo di definire un membro dello spazio dei nomi tramite using-declaration

namespace X { extern int i; } 

namespace N { using X::i; } 

int N::i = 1; 

int main() {} 

sto ottenendo risultati diversi per diversi compilatori. Sto cercando di capire per quale compilatore dovrei presentare un bug report per:

  • Clang: dà il seguente errore del compilatore: Nessun membro chiamato 'i' nello spazio dei nomi 'N'

  • GCC e Visual C++ lo compila senza errori.

Per confronto la seguente dà errore del compilatore con tutti e tre i compilatori:

namespace X { void f(); } 

namespace N { using X::f; } 

void N::f() {}; 

int main() {} 
+1

Divertente, VS2013 compila, ma IntelliSence dice "Errore: spazio dei nomi" N "non ha un membro effettivo" i "' – AlexD

+0

Penso che la risposta sia qui: [collegamento] (http://stackoverflow.com/questions/6175705/scope-of-using-declaration-within-a-namespace) – Jorj

+0

@Supremum Puoi ottenere la tua copia dello standard C++ da leggere su https://isocpp.org/std/the-standard. – Coder

risposta

11

attuale bozza di lavoro N4527, [8.3p1]:

[...] When the declarator-id is qualified, the declaration shall refer to a previously declared member of the class or namespace to which the qualifier refers (or, in the case of a namespace, of an element of the inline namespace set of that namespace (7.3.1)) or to a specialization thereof; the member shall not merely have been introduced by a using-declaration in the scope of the class or namespace nominated by the nested-name-specifier of the declarator-id. [...]

Quindi, sicuramente mal formati; GCC e MSVC sono sbagliati.