2010-10-04 4 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

Есть ли у вас тело от оператора, доступного при явном создании экземпляра? – Anycorn

+2

Вы показали нам объявление, но компилятор жалуется на определение. Как вы определяете шаблон? – Potatoswatter

ответ

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

+2

Это специализация, а не инстанцирование. – Potatoswatter

0

Я думаю, что происходит в том, что вы явно инстанцировании, но компилятор смотрит в заголовки и не могу найти код, который должен получить инстанцированный. Посмотрите, что оператор фактически реализован для этого типа.

0

Действительно проблема была с определением, теперь она компилируется нормально.

Смежные вопросы