C ++ явный шаблонный экземпляр оператора - PullRequest
0 голосов
/ 04 октября 2010

У меня есть шаблонный класс, который я пытаюсь создать в явном виде:

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 

Есть идеи, что я делаю не так?

Заранее спасибо

Ответы [ 3 ]

0 голосов
/ 04 октября 2010

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

0 голосов
/ 11 октября 2010

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

0 голосов
/ 04 октября 2010

Следующий код компилируется на 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...