我正在编写一个可以支持行和列主存储的Matrix模板类。理想情况下,我只想专注于受存储格式影响的方法。但是,当我尝试专门化一个方法(如下所示)时,我只得到错误信息。
enum MatrixStorage
{
ColumnMajor,
RowMajor
};
template< typename T,
unsigned rows,
unsigned columns,
MatrixStorage storage = ColumnMajor >
class Matrix
{
public:
T & operator () ( unsigned const & row, unsigned const & column );
};
template< typename T,
unsigned rows,
unsigned columns >
T & Matrix< T, rows, columns, ColumnMajor >::
operator () ( unsigned const & row, unsigned const & column )
{
return elements[ ( row + ( rows * column ) ) % ( rows * columns ) ];
}
template< typename T,
unsigned rows,
unsigned columns >
T & Matrix< T, rows, columns, RowMajor >::
operator () ( unsigned const & row, unsigned const & column )
{
return elements[ ( ( row * columns ) + column ) % ( rows * columns ) ];
}
错误输出:
error C3860: template argument list following class template name must list parameters in the order used in template parameter list
error C2976: 'maths::Matrix<T,rows,columns,storage>' : too few template arguments
error C3860: template argument list following class template name must list parameters in the order used in template parameter list
按照其他questions中给出的示例,看起来语法是正确的。尽管如此,我能让它工作的唯一方法是专门化类本身(如下所示),但这意味着要复制所有不依赖于存储格式的方法。
enum MatrixStorage
{
ColumnMajor,
RowMajor
};
template< typename T,
unsigned rows,
unsigned columns,
MatrixStorage storage = ColumnMajor >
class Matrix;
template< typename T,
unsigned rows,
unsigned columns >
class Matrix< T, rows, columns, ColumnMajor >
{
T & operator () ( unsigned const & row, unsigned const & column );
};
template< typename T,
unsigned rows,
unsigned columns >
class Matrix< T, rows, columns, RowMajor >
{
T & operator () ( unsigned const & row, unsigned const & column );
};
答案 0 :(得分:3)
您不能部分专门化功能模板,其中包括模板的成员功能。另一种方法是创建一个模板助手类,它提供您需要的功能,然后从模板的成员函数将调用转发给类模板。
或者,由于您的用例非常简单,您可以编写一个辅助函数(模板与否,不需要它是完整的类),它将为您提供给定坐标和模式的数组中的索引
template <MatrixStorage m>
int index_of( int row, int col, int rows, int columns ) {
return ( row + ( rows * column ) ) % ( rows * columns );
}
template <>
int index_of<RowMajor>( int row, int col, int rows, int columns ) {
return ( ( row * columns ) + column ) % ( rows * columns );
}
您可以通过采用将在运行时检查的MatrixStorage
类型的额外参数(简单if
)将其设为非模板