模板成员函数专业化

时间:2013-12-06 05:07:44

标签: c++ templates

我有这个:

//forward declaration
template<typename Elem, int D1 = 1, int D2 = 1, int D3 = 1>
class matrix;

template<typename Elem, int D1, int D2, int D3>
struct matrix_deref_type_trait
{
    typedef matrix<Elem, D2 == 1 ? 1 : D1, D3 == 1 ? 1 : D2, 1> matrix_deref;
};

template<typename Elem, int D1>
struct matrix_deref_type_trait<Elem, D1, 1, 1>
{
    typedef Elem matrix_deref;
};

template<typename Elem, int D1, int D2, int D3>
class matrix:public object
{
public:
    typedef typename matrix_deref_type_trait<Elem, D1, D2, D3>::matrix_deref matrix_deref;

    inline matrix_deref operator[](int J)
    {
        ...
    }
}

并且希望专门针对运算符[](在类体外)的情况:

template<typename Elem, int D1>
typename matrix<Elem, D1, 1, 1>::matrix_deref matrix<Elem, D1, 1, 1>::operator[](int J)
{
    return M_ptr[J];
}

但是我收到了这个错误:

error C2244: 'matrix<Elem,D1,D2,D3>::operator []' : unable to match function definition to an existing declaration

如果没有全班专业化,我可以覆盖这个成员函数吗?我该怎么办?感谢。

2 个答案:

答案 0 :(得分:2)

您无法专门化模板类的非模板方法。您只能专门化模板类本身。或者您可以专门化任何模板方法(模板或非模板类)。

专门用于模板类的非模板方法毫无意义:编译器需要知道整个类的外观。而你只是在说:嘿,我不关心课程,但我知道的是这种方法的样子。

答案 1 :(得分:2)

专门研究矩阵类:

template<typename Elem, int D1>
class matrix<Elem,D1,1,1>
{
public:
    typedef typename matrix_deref_type_trait<Elem, D1, 1, 1>::matrix_deref matrix_deref;//this line 

    inline matrix_deref operator[](int J)
    {
        std::cout << "special\n";
    }
};

你也不需要在特质课上进行?:检查,因为如果D2D31,它将始终选择特质专长。