C ++运算符的显式模板实例化

时间:2010-10-04 00:56:36

标签: c++ templates c++11

我有一个模板类,我试图显式实例化:

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 :(得分: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;
}

答案 1 :(得分:0)

我认为发生的事情是你明确地实例化它,但编译器正在查找头文件并且无法找到应该实例化的代码。看看操作符实际上是针对该类型实现的。

答案 2 :(得分:0)

确实问题在于定义,现在它正在编译好。