2009-07-10 19 views
6

C++ uygulamasında, sınıfınızı ve işlev tanımlarınızı anonim bir ad alanı içinde sarmalayarak iç bağlantıyı belirtirsiniz. Ayrıca, şablonları açıkça ortaya çıkarabilir, ancak şablonların açık örneklerine uyan standartların aynı ad alanında olması gerekir. AFAICT bu derleme, ama GCC üzerinde başarısız: hata ileAnonim ad alanı tüm ad alanlarını kapsıyor mu?

namespace foo { 

template<class T> 
class bar {}; 

} 

using namespace foo; 

namespace { 
template class bar<int>; 
} 

int main() 
{ 
    return 0; 
} 

:

namespace_test.cpp:11: error: explicit instantiation of 'class bar<int>' in namespace '<unnamed>' (which does not enclose namespace 'foo') 

anonim ad sadece gerçekten bir ad olarak işleyen, bağlantı tasarımı olmalıdır çünkü ilginçtir ve Küresel ad alanı, her ad alanını kapladığı için kesinlikle foo'yu kapsamaktadır. Ama bu bile çalışmıyor !:

template<class T> 
class bar {}; 

using namespace foo; 

namespace { 
template class bar<int>; 
} 

int main() 
{ 
    return 0; 
} 

sadece yerine küresel ad listeleyen aynı hata ile başarısız Hangi:

namespace_test.cpp:11: error: explicit instantiation of 'class bar<int>' in namespace '<unnamed>' (which does not enclose namespace '::') 

:/

+0

GCC'nin hangi sürümü - hangi derleyici seçenekleri - veya hangi platform? İlk örneği G ++ 4.0.1 ile MacOS X'te ve -Wall olmadan çalıştı ve şikayet veya uyarı olmadan derlendi. Solaris üzerinde –

+0

GCC 4.2. –

cevap

10

Anonim ad anonim A ad

namespace _TU_specific_unique_generated_name 
{ 
    // ... 
} 
using namespace _TU_specific_unique_generated_name; 

mantıksal olarak eşdeğerdir veya başka üyelerinin bağlantı üzerinde hiçbir etkisi yoktur. Özellikle anonim bir isim alanının üyeleri sihirli bir şekilde iç bağlantıya sahip değildir.

+1

Açık olanı ekleyeceğim, ki _TU_specific_unique_generated_name içindeki dosyalar dosyanın dışında kullanılamaz. – Valentein

+0

Aslında, standart olarak kabul edilen bu tam yol tarif ediliyor. –

6

ben size cevap var - anonim ad alanları farklı, benzersiz ad alanlarıdır. BTW, derleyici bu ad alanını dahili olarak temsil etmek için bazı rasgele büyük tamsayılar üretir.

0

Stroustrup'a (bölüm 8.2.5.1) göre, genel ad alanı, anonim (adlandırılmamış) ad alanına erişime sahiptir, ancak açıkça, tersi söyleyemez. Sana bir using ifadesi ile ad belirtmek veya tamamen isimsiz isim alanı içinde başka ad başvurular nitelemek olurdu bekliyoruz

...

7

İlk: Açıkça bir sınıf örnekleniminden, sen tanımlayan değil yeni bir sınıf şablonu. Ne "lütfen burada int için sınıf şablon çubuğunu başlatınız" yazıyor " ". Başka bir ad alanında, bir sınıf şablonunu kısmen uzmanlaştıramayacağınız gibi bunu başka bir ad alanında yapamazsınız. Özellikle, açıkça örneklendirilecek şablon tanımlanmış olmalı ve örneğinizde (anonim ad alanı) yok: bar <>, yalnızca foo :: bar <>.

İkincisi: Anonim ad alanı gerçek bir ad alanıdır (her çeviri biriminde farklı olsa da). Ayrıca bağlantıyı sihirli olarak değiştirmez. {} Ad alanı içinde bildirilen her şey, diğer ad alanı kapsamlarında olduğu gibi, hala varsayılan bağlantıya sahiptir. IIRC, çeviri birimi özel, ancak harici bağlantı nesneleri için izin vermek için bile eklendi.