【问题标题】:Template argument calculations模板参数计算
【发布时间】:2013-06-27 10:43:21
【问题描述】:

(注意:在没有 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 &gt;= rows),编译会以 internal compiler error: in force_constant_size at gimplify.c:691 在最后一个代码行 .joinV( temp )

结束

过程中的矩阵大小(我的猜测):

  • 返回值:(行 x 列)矩阵
  • getSubMatrix&lt;rows-numRowsUp,cols&gt;( numRowsUp, 0 ):当numRowsUp&gt;=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

【问题讨论】:

  • 您是否尝试过更新的编译器版本?
  • 哦,对不起......我忘了提到我们仅限于没有 c++0x 标志的 gcc 4.6:P
  • 我希望对额外的布尔参数进行部分特化,该参数将获得 numRowsUp&gt;=rows 作为值。
  • 我会尽快尝试的:D

标签: c++ templates c-preprocessor


【解决方案1】:

预处理器 MAX 有什么问题? 您可以使用 MAX(0, rows-numRowsUp) 作为模板参数。或者试试这个作为模板参数:(numRowsUp&gt;=rows)? 0 : rows-numRowsUp。这样就永远不会实例化错误的模板。

【讨论】:

  • 什么...我发誓我试过这个,编译器对我大喊大叫。是否有任何要求才能使用正确的 MAX?
猜你喜欢
  • 1970-01-01
  • 2012-10-26
  • 2013-07-22
  • 2021-02-17
  • 2017-02-09
  • 1970-01-01
  • 1970-01-01
  • 2017-11-20
  • 1970-01-01
相关资源
最近更新 更多