2010-10-04 64 views
0

我有一個模板類,我米試圖顯式實例的顯式模板實例:C++操作

template<T> 
struct tmat2x3 
{ 
... 
typedef tvec3<T> col_type; 
.. 
}; 

操作聲明如下:

template <typename T> 
typename tmat2x3<T>::row_type operator* (tmat2x4<T> const & m, typename tmat2x3<T>::col_type const & v); 

我明確實例化操作使用以下內容:

template tmat2x3<unsigned char>::row_type operator * (tmat2x3<unsigned char> const &m, tmat2x3<unsigned char>::col_type const &s); 

gcc給我以下錯誤:但是:

../glm/glm_core.cpp: In instantiation of ‘typename glm::detail::tmat2x3<T>::row_type glm::detail::operator*(const glm::detail::tmat2x3<T>&, const typename glm::detail::tmat2x3<T>::col_type&) [with T = unsigned char]’: 
../glm/glm_core.cpp:443: instantiated from here 
../glm/glm_core.cpp:443: error: explicit instantiation of ‘typename glm::detail::tmat2x3<T>::row_type glm::detail::operator*(const glm::detail::tmat2x3<T>&, const typename glm::detail::tmat2x3<T>::col_type&) [with T = unsigned char]’ but no definition available 

關於我在做什麼的任何想法是錯誤的?

在此先感謝

+0

當您明確實例化時,您是否有可用的body off操作符? – Anycorn 2010-10-04 01:14:29

+2

你已經向我們展示了這個聲明,但編譯器正在抱怨這個定義。你如何定義模板? – Potatoswatter 2010-10-04 01:31:10

回答

0

下面的代碼編譯並在VS2008。我相信問題是我們可以在您的運營商聲明中看到的錯誤標識符tmat2x4

template < typename T > struct tmat2x3{ 
    typedef vector<T> col_type; 
}; 

template <typename T> typename tmat2x3<T>::col_type operator* (tmat2x3<T> const & m, typename tmat2x3<T>::col_type const & v); 

template <> tmat2x3<unsigned char>::col_type operator * (tmat2x3<unsigned char> const &m, tmat2x3<unsigned char>::col_type const &s){ 
    return tmat2x3<unsigned char>::col_type(); 
} 

int main(int argc, char ** argv){ 
    tmat2x3<unsigned char> blah; 
    blah * vector<unsigned char>(); 
    return 0; 
} 
+0

我更正了錯字,但是您的代碼並未強制獨立模板實例化,它只能用作常規模板。 – kinzeron 2010-10-04 01:27:31

+2

這是一個專業化,而不是一個實例化。 – Potatoswatter 2010-10-04 01:30:31

0

我認爲正在發生的事情是,你明確的實例,但編譯器查找到頁眉和無法找到應該實例化的代碼。看看操作員實際上是爲那種類型實現的。

0

確實問題出在定義上,現在編譯好了。