2014-10-17 28 views
15
Aşağıdaki küçük kod VS2008 ve GCC 4.8.2 de derler

typedef Foo <> Foo derler ama geçerli mi?

template<typename T=void> 
struct Foo 
{ 
}; 

// typedef Foo<> Foo; // Does *NOT* compile 

int main() 
{ 
    typedef Foo<> Foo; 
    Foo f1; 

    // Foo<char> f2;  // Does *NOT* compile 
    //::Foo<char> f3; // COMPILES 
} 

geçerli mi?

struct Foo { }; 

namespace bar { 
    struct Foo { }; 
} 

Sadece farklı bir kapsamda adını üzerine yazıyorsanız:

+1

Şablonda varsayılan argümanlar sağlıyorsunuz. Bu kesinlikle geçerli. –

+2

@Captain: Peki ya ikisi de Foo diye isimlendirilmişler? – Cameron

cevap

17

3.3.10/1 C++ 11 gereğince:

bir isim aynı adı taşıyan açık bir bildiriminde tarafından gizlenebilir iç içe bildirim bölgesi veya türetilmiş sınıfı.

(Vurgu benim) şablonu adı Foomain() içine typedef adı Foo tarafından (farklı kapsam) gizli olabilir yüzden

ancak aynı kapsamda şablon adı ilan edilir değil.

bu benzer durum yasal neden gelince:

struct Foo 
{ 
}; 

typedef Foo Foo; // *DOES* compile 

açıkça 7.1.3/3 ile izin Yani: Belirli bir sigara sınıf kapsamında

, bir typedef belirteci olabilir kapsamındaki bildirilen herhangi bir türün adını, daha önce başvurduğu türe başvurmak için kullanılır.

+4

+1! –

+1

3.3.1 [basic.scope.declarative]/p4 ayrıca ilgilidir. –

11

Evet bu geçerli olduğunu aynı nedenle, geçerli bu. Ana içerisi, yine böyle bir şey yapabilirsiniz:

::Foo<int> f2; 
+0

Ah, gölgeleme yaz. Sinsi sinsi sinsi: O – Cameron

+0

Bu cevabın doğru olmadığını düşünüyorum - bir şablon yazılmıştır bir typedef (bir isim alanında) –

+0

@ DieterLücking Neden? Ben ana kadar kolay bir şekilde oluşturabilirim 'int Foo = 7;' Bu sadece bir isim. – Barry

İlgili konular