2015-07-18 37 views
16

Aşağıdaki programı göz önünde bulundurun. o C++ standardına uygun olarak iyi biçimlenmiş ya da değil mi (standardın ilgili bölümlerine yapılan atıflar gerekli):İsim-alanı bildirimi kullanılarak ad alanı üyesi tanımlanmaya çalışılıyor

namespace X { extern int i; } 

namespace N { using X::i; } 

int N::i = 1; 

int main() {} 

farklı derleyiciler için farklı sonuçlar alıyorum.

  • Clang: Ben bir hata raporu gerektiğini derleyici için anlamaya çalışıyorum 'N'

  • GCC 'i' ad alanında adında bir üyeyi: Aşağıdaki derleyici hata verir ve Visual C++, hataları olmadan derler. Karşılaştırma için

şu üç derleyiciler ile derleyici hata verir:

namespace X { void f(); } 

namespace N { using X::f; } 

void N::f() {}; 

int main() {} 
+1

Funny, VS2013 derler ama IntelliSence diyor ki "Hata: namespace" N "'nin gerçek bir üyesi yok" i "' – AlexD

+0

Bence cevap burada: [link] (http://stackoverflow.com/questions/6175705/ad-kapsam-içinde-beyan-içinde-bir-isim-alanı) – Jorj

+0

@Supremum https://isocpp.org/std/the-standard adresinde okumak için C++ standardının kopyasını alabilirsiniz. – Coder

cevap

11

Güncel çalışma taslağı N4527, [8.3p1]: Yani, kesinlikle kötü şekillendirilmiş

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

; GCC ve MSVC yanlış.