2012-03-24 35 views
5

İç içe geçmiş bir şablonu nasıl uzmanlaşırım? (Aşağıdaki hataya bakın.)İç içe şablon uzmanlığı "Açık şablon bağımsız değişkenlerinin yasa dışı kullanımı" ile sonuçlanır?

using std::reverse_iterator; 

template<typename It> 
reverse_iterator<It> make_reverse_iterator(const It &it) 
{ 
    return reverse_iterator<It>(it); 
} 

template<typename It> 
It make_reverse_iterator<reverse_iterator<It> >(const reverse_iterator<It> &it) 
{ 
    // Above     ^
    // error C2768: 
    // 'make_reverse_iterator': illegal use of explicit template arguments 
    return it.base(); 
} 
+0

Örnekte iç içe geçmiş şablon nerede? Tek gördüğüm, izin verilmeyen kısmi işlev uzmanlığı. –

+0

@ R.MartinhoFernandes: Belki yanlış terimi kullandım ... Ben (iç içe) tür 'It' dayalı templu 'reverse_iterator ', konusunda uzmanlaşmış anlamına geliyordu. – Mehrdad

+0

İşlev şablonlarının kısmi özelleştirilmesine izin verilmiyor - burada neler oluyor? – Jon

cevap

6

Bu, bir işlev şablonunun kısmi bir özelleşmesidir. Buna izin verilmiyor.

yerine bir aşırı ile bu örnekte sorunu çözebilir: aşırı yükler sınıf şablonları kısmi uzmanlaşma için çare olabilir çalışmayan vakalarda

template<typename It> 
It make_reverse_iterator(const reverse_iterator<It> &it) 
{ 
    return it.base(); 
} 

.

+0

+1, ancak neden "kısmi" denir? – Mehrdad

+0

Normal çözümün işlevi aşırı yüklediği izlenimindeydim ...? – Jon

+0

@Jon: Oh, Bu durumda aslında aşırı yüklenmenin işe yaramadığını fark ettim (aşırı yüklenmeler yapmak her zaman mümkün değildir) Teşekkürler, düzenleyecektir. –

4

Bu, partial function template specialization numaralı telefona izin verilmez. Bununla birlikte işlevini aşırı yükleyerek aynı etkiyi elde edebilirsiniz:

template<typename It> 
It make_reverse_iterator(const reverse_iterator<It> &it) 
{ 
    return it.base(); 
} 

üzerinde bir şablon uzmanlık, ancak parametresi bir const_reverse_iterator<It> olan make_reverse_iterator bir şablon aşırı yük değildir.

+0

Bana bir şey söyler [Dimov/Abrahams] (http://www.gotw.ca/publications/mill17.htm) burada geçerli olabilir ve bu yüzden buradaki çözümlerin yalnızca bir tanesi * doğrudur, ancak ikisi de değildir (aşırı yükleme veya uzmanlaşma) Hangisini bilmiyorum). Herhangi bir fikir? – Mehrdad

İlgili konular