2016-01-05 14 views
5
küresel

bulunuyorsa anonim ad değişkenine nasıl erişilir durumunu düşünelim: Buradaaynı değişken

#include <iostream> 

int d =34; 

namespace 
{ 
    int d =45; 
} 

int main() 
{ 
    std::cout << ::d ; 
    return 0; 
} 

çıktı 34 olduğunu :: genel ad alanını ifade eder çünkü. Ama ben 3. satır yorumsam, çıktı garip olan 45.

Ben std::cout << d ; kullanırsanız -

s.cxx:12:15: error: reference to ‘d’ is ambiguous

nasıl unnamed_namespace erişebilir hata :: d bu senaryoda alıyorum?

ps: Ben isimsiz ad yalnızca dosya kapsamı

+0

Sen yapamaz sen isimsiz ad Işlevinizin koyabilirsiniz (ancak bu main' 'ile yapamaz) sürece. Tabii ki, aynı ismi kullanmamak da dahil olmak üzere birçok geçici çözüm var ... – Brian

cevap

9

Başka bir şey yardımı olmadan main iki d s arasındaki belirsizliği edemez içinde aka görünür statik küresel değişkenler için kullanıldığını okudum.

Bu ikisi arasında ayrım yapmanın bir yolu, ad alanında bir referans değişkeni oluşturmak ve ardından main'da referans değişkeni kullanmaktır.

#include <iostream> 

int d = 34; 

namespace 
{ 
    int d = 45; 
    int& dref = d; 
} 

int main() 
{ 
    std::cout << dref << std::endl; 
    return 0; 
} 

Ama sonra, neden aynı değişkenle karıştırılsın? Seçeneğiniz varsa, ad alanında farklı bir değişken adı kullanın veya ad alanına bir ad verin.

namespace 
{ 
    int dLocal = 45; 
} 

int main() 
{ 
    std::cout << dLocal << std::endl; 
    std::cout << d << std::endl; 
    return 0; 
} 

veya

namespace main_detail 
{ 
    int d = 45; 
} 

int main() 
{ 
    std::cout << main_detail::d << std::endl; 
    std::cout << d << std::endl; 
    return 0; 
} 
+0

Sadece ona 'detail' derdim ama evet. –

İlgili konular