2015-07-18 15 views
16

Betrachten Sie das folgende Programm zu definieren. Ist es gut ausgebildet oder nicht, gemäß dem C++ Standard (Verweise auf relevante Teile der Norm erforderlich):Versuch Namespace Mitglied über using-Deklaration

namespace X { extern int i; } 

namespace N { using X::i; } 

int N::i = 1; 

int main() {} 

ich unterschiedliche Ergebnisse für verschiedene Compiler bin immer. Ich versuche, für herauszufinden, was Compiler ich sollte einen Fehlerbericht für Datei:

  • Clang: Gibt den folgenden Compiler-Fehler: Kein Mitglied namens 'i' im Namensraum 'N'

  • GCC und Visual C++ kompiliert es ohne Fehler.

Zum Vergleich gibt die folgende Compiler-Fehler mit allen drei Compiler:

namespace X { void f(); } 

namespace N { using X::f; } 

void N::f() {}; 

int main() {} 
+1

Lustig, VS2013 kompiliert, aber IntelliSence sagt '" Fehler: Namespace "N" hat kein Mitglied "i" ' – AlexD

+0

Ich denke, die Antwort ist hier: [link] (http://stackoverflow.com/questions/6175705/scope of using-Deklaration-im-Namespace) – Jorj

+0

@Supremum Sie können Ihre eigene Kopie des C++ Standard lesen bei https://isocpp.org/std/the-standard bekommen – Coder

Antwort

11

Aktuelle Arbeitsentwurf 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. [...]

Also, auf jeden Fall schlecht ausgebildet sind; GCC und MSVC sind falsch.