2011-08-03 19 views
6

Vandevoorde ve Josuttis'in "C++ Şablonları The Complete Guide" (bu arada oldukça iyi görünüyor) okuyorum. Bu iddia (bölüm 3.3) yanlış görünüyor. and is not in the published errata:Bu ders kitabı yanlış mı? Bazı üye fonksiyonları uzmanlaşan ama diğerleri değil

Eğer bir sınıf şablonunu uzmanlaşırsanız, tüm üye fonksiyonlarını da uzmanlaşmalısınız. Tek bir üye fonksiyonunu uzmanlaştırmak mümkün olsa da, bunu yaptıktan sonra artık tüm sınıfı uzmanlaştıramazsınız. gcc şablonu

Oysa Aşağıdaki derler

<typename T> 
struct C { 
    T foo(); 
    T bar(); 
}; 

template <> 
struct C<int> { 
    int foo(); 
    int bar() {return 4;} 
}; 

template <typename T> 
T C<T> :: foo() {return 0;} 

template <typename T> 
T C<T> :: bar() {return 1;} 

int C<int> :: foo() {return 2;} 

template <> 
float C<float> :: bar() {return 3;} 

#include <cassert> 

int main() { 
    C<int> i; 
    C<float> f; 
    assert (2 == i .foo()); 
    assert (0 == f .foo()); 
    assert (4 == i .bar()); 
    assert (3 == f .bar()); 
} 

Ben C<int>::foo uzmanlaşmış ve C<float>::bar yüzden, ders kitabı, yanlış standardın ötesinde gcc veya ben bütün durumu yanlış anlama ben?

Teşekkürler.

+0

Kuralı yanlış. Bir üye fonksiyonunu uzmanlaştırdıktan sonra, diğer tüm tiplerde değil, aynı türde bir sınıfı uzmanlaşamazsınız. –

cevap

5

uzmanlaşabilir:

template <typename T> struct C 
{ 
    T foo()  { return 0;} 
    T bar()  { return 1;} 
}; 

// partial specialization of foo on C<int> 
template <> 
int C<int> :: foo() {return 2;} 

// partial specialization of bar on C<float> 
template <> 
float C<float> :: bar() {return 3;} 

// will not compile, C<int> already partially specialized 
template <> 
struct C<int> 
{ 
    int foo() {return 10;} 
    int bar() {return 10;} 
}; 
+1

Bu, sıradan bir yeniden tanımlama hatasıdır, şablonlarla ilgisi yoktur. Bu yüzden kafam karıştı mı? Basitçe, şablon bağlamında bahsedildiği için? İyi keder ... – spraff

+0

Bu bağlamda bunu evet gibi düşünebilirsiniz. 'Foo()' uygulamasının 'C 'uzmanlığında kaldırılmasını sağlarsanız, kısmi uzmanlığı yalnızca bu işlevin uygulanması olarak ele alır. – Chad

4

Hayır, kitap yanlış değil. Şimdi açıkça C<int> veya C<float> uzmanlaşmak edemez C<float>

için C<int> ve bar için foo - Sizin anlayış Sana sadece 1 üye işlevuzman var Bu durumda :)

korkuyorum vardır. Ama sen bunu yapamazsın C<char>

+0

Lütfen güncellenmiş soruma bakın. Şimdi C için bir fonksiyon (bar) uzmanlık yaptık ve 'C 'için tam bir uzmanlık verdim - bu *** ders kitabı ile çelişmiyor mu? – spraff

+0

Hayır, C :: foo() 'nun kısmi uzmanlığınız, tam olarak tamamen özelleştirilmiş sürümün tanımıdır. Ayrıntılar için aşağıya bakın. – Chad

İlgili konular