2013-05-09 15 views
7

ben şöyle yuvalanmış şablonu tanımlamak çalışıyorumİç içe geçmiş şablonu tanımlamanın yasal sözdizimi nedir?

class A { 
    template <typename T> class B { 
     template <typename U> void foo(U arg); 
    }; 
}; 

aşağıdaki iç içe şablon var:

template <typename T, typename U> void 
A::B<T>::foo(U arg) {...} 

Ama declaration is incompatible with function template hatası alıyorum. Bunu yapmak için yasal sözdizimi nedir?

+3

Neredeyse yanı sadece sağ orada tanımlayabilirsiniz. Ayrı bir dosyaya giremez. – chris

+2

@chris: Sadece ayrı bir çeviri biriminde bulunamadığından farklı bir dosyada bulunamayacağı anlamına gelmez. Aynı dosyada olması gerekse bile, yine de uygulamayı arayüzden ayırabilirsiniz. –

+0

@MooingDuck, True, files! = TUs. Bağlantılı bir dosyada genel olarak tanımlama satırları boyunca daha çok düşünüyordum. Ve ben, kendimi, sınıf tanımının dışındaki şablonları tanımlamayı seviyorum, bu yüzden neredeyse dedim. OP'nin ilk noktaya doğru gideceğini düşündüm, başarısız olduğu yerde. – chris

cevap

10

Şablon bildirimleri ayırmak gerekir:

template <typename T> 
template <typename U> 
void 
A::B<T>::foo(U arg) { … } 
+0

Bunu denedim ama işe yaramıyor gibi görünüyor - derleyici 'U' ile T' kafa karıştırıcı gibi görünüyor. Ben 'foo' içinde arg.UMember()' diyorum, ancak derleyici A :: B 'un UMember ' – mchen

+0

üyesine sahip olmadığını bildiriyor. Başlatma listesi oluşturucuları yerine boş kalıplar varsayılan yapıcıları çağırıyor ve bu. Bugün öğrenme için son derece iyi bir gün. – chris

+0

@MiloChen: http://coliru.stacked-crooked.com/view?id=4db49730dd7df44b6f01839277cc6c4f-50d9cfc8a1d350e7409e81e87c2653ba. "U" şablonundan önce "T" şablonunuz var mı? [Onlar doğru sırada olmalılar.] (Http://coliru.stacked-crooked.com/view?id=0b98f6449a84341a2111b33f48a3536e-50d9cfc8a1d350e7409e81e87c2653ba) –

İlgili konular