2013-05-04 28 views
6

Başka bir şablon sınıfından bir şablon sınıfının şablon üyesi işlevine erişmeye çalışırken derleyici hataları alıyorum. getSubmatrix için bir işlev çağrısı derleyici uyarıları, "ifade sonucu kullanılmayan", (0, 0) parametreleriyle sonuçlanır, nihayet derleyici hatasıyla başarısız olur "statik olmayan üye işlevine başvurulmalıdır".Başka bir şablon sınıfından bir şablon sınıfının şablon üyesi işlevi çağrılmıyor

matris sınıfı:

template <std::size_t m, std::size_t n, typename T, std::size_t rowPadding = 0> 
class Matrix 
{ 
public: 
    ... 

    template <std::size_t p, std::size_t q> 
    Matrix<p, q, T, n - q>& getSubmatrix(std::size_t column, std::size_t row) 
    { 
     ... 
    } 
}; 

dönüşümü sınıfı: Matrix<4, 4, float> yerine Matrix<4, 4, T> için matris türünü değiştirerek geçerli derleme neden olacağını

template <typename T> 
class Transform 
{ 
public: 
    ... 

    Matrix<4, 4, T> matrix() const 
    { 
     ... 

     Matrix<4, 4, T> result; 
     result.getSubmatrix<3, 3>(0, 0) = Matrix<3, 3, T>(); 

     ... 
    } 
}; 

Not. Derleyici clang 4.0 ve dil sürümü C++ 11'dir.

+1

Bu giriş için çok teşekkür ederim, bu gerçekten Clang hata mesajından çıkarılamayacak kadar zordu. –

cevap

12

anahtar kelimesini template eklemek gerekir: Onsuz

result.template getSubmatrix<3, 3>(0, 0) = Matrix<3, 3, T>(); 
//  ^^^^^^^^ 

, derleyici < bir karşılaştırma operatörüdür düşünürler.

PS. Bu durumda, g ++ biraz daha anlaşılır bir hata üretir:

+0

Çok teşekkür ederim! –

+2

Gosh, C++ template sözdizimi çok sezgisel.

+0

Dil özelliklerinin daha iyi yapılabilmesi için şablon sözdizimi icat edilmiş biri gibi ...: P –