(注意:在没有 C++0x 标志、外部限制的 GCC 4.6 上工作。我也对 C++11 和/或更新的编译器会发生什么感兴趣)
我有一个模板类,用于对固定大小的矩阵进行操作:
template<size_t rows, size_t cols, class Type>
class MatrixFixed;
在该类中,我定义了一个具有以下方面的“移位”操作:
template<size_t rows, size_t cols, class Type>
template<size_t numRowsUp>
MatrixLogicalFixed<rows,cols,Type> MatrixLogicalFixed<rows,cols,Type>::shiftUp( const Type & filler ) const
{
if( (numRowsUp>=rows) )
{
return MatrixLogicalFixed<rows,cols,Type>(filler);
}
else
{
MatrixLogicalFixed<numRowsUp,cols,Type> temp(filler);
return this->getSubMatrix<rows-numRowsUp,cols>( numRowsUp, 0 )
.joinV( temp );
}
}
这个想法是,如果要移动的位置数大于总行数,则可以返回一个填充有默认值的矩阵。但是,在这些情况下 ( numRowsUp >= rows
),编译以内部编译器错误结束:in force_constant_size at gimplify.c:691 at the last code line.joinV( temp )
过程中的矩阵大小(我的猜测):
- 返回值:(行 x 列)矩阵
getSubMatrix<rows-numRowsUp,cols>( numRowsUp, 0 )
: 当numRowsUp>=rows
, 由于 size_t 下溢,这将导致一个巨大的数字joinV
函数试图推断出适当的返回大小,但这是不可能的。
这是 joinV 声明):
template<size_t rows, size_t cols, class Type>
template<size_t rows2, size_t cols2>
MatrixLogicalFixed<rows+rows2,cols,Type> MatrixLogicalFixed<rows,cols,Type>::joinV(const MatrixLogicalFixed<rows2,cols2,Type> & B) const
由于if
条件是在编译时定义的,因此这是一段在有问题的情况下永远不会达到的代码。到目前为止我已经尝试过:
- 在预处理器中使用模板参数 #if -- 显然是错误的。
- 寻找可以解决问题的任何类型的预处理器宏 MIN 或 MAX。
通常的部分专业化看起来不是一个有效的解决方法,因为存在无限的值组合......我对任何类型的解决方案持开放态度。我只想让我的班级编译:D