我有这个:
//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
如果没有全班专业化,我可以覆盖这个成员函数吗?我该怎么办?感谢。
答案 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";
}
};
你也不需要在特质课上进行?:
检查,因为如果D2
和D3
是1
,它将始终选择特质专长。