2011-12-11 24 views
32

Olası Çoğalt:.template (nokta-şablon) yapı kullanım

#include <iostream> 

template <int N> 
struct Collection { 
    int data[N]; 

    Collection() { 
    for(int i = 0; i < N; ++i) { 
     data[i] = 0; 
    } 
    }; 

    void SetValue(int v) { 
    for(int i = 0; i < N; ++i) { 
     data[i] = v; 
    } 
    }; 

    template <int I> 
    int GetValue(void) const { 
    return data[I]; 
    }; 
}; 

template <int N, int I> 
void printElement(Collection<N> const & c) { 
    std::cout << c.template GetValue<I>() << std::endl; /// doesn't compile without ".template" 
} 

int main() { 
    Collection<10> myc; 
    myc.SetValue(5); 
    printElement<10, 2>(myc); 
    return 0; 
} 

O: Ben bir kod garip segmenti rastlamak ettik
Where and why do I have to put the “template” and “typename” keywords?

.template anahtar kelimesi olmadan derlenmemiştir printElement işlevi. Bunu daha önce hiç görmedim ve ne için gerekli olduğunu anlamıyorum. Kaldırmaya çalışırken, şablonla ilgili derleme hatalarım var. Öyleyse böyle bir yapı kullanıldığı zaman sorum var mı? Yaygın mıdır

+8

: Daha fazla ayrıntı açıklama için

, burada kabul cevabı okundu belirteçleri, bir nokta, ardından "template" anahtar sözcüğünü takip eder. Ayrıca yazmak için yasal olurdu c. Şablon GetValue '. 'Template', 'GetValue' üye işlevine bağlı, nokta değil. – jalf

cevap

40

GetValue bağımlı adıdır ve bu nedenle açıkça neyi c izleyen bir fonksiyon şablon değil, bazı üye veridir derleyici söylemek gerekir. Bu nedenle, bu sorunu gidermek için template anahtar kelimesini yazmanız gerekir. template anahtar sözcüğü olmaksızın

,

c.GetValue<I>() //without template keyword 

olarak yorumlanabilecek şunlar kullanılmıştır:

olan
//GetValue is interpreted as member data, comparing it with I, using < operator 
((c.GetValue) < I) >() //attempting to make it a boolean expression 

, < operatör daha azını yorumlanır ve > yorumlanır büyüktür Şebeke. Yukarıdaki yorum yanlıştır, çünkü mantıklı değildir ve bu nedenle derleme hatasıyla sonuçlanır. Bir `.template` (tek nokta şablon yapısı), ancak iki değil, Sadece kayıt için