(ПРИМЕЧАНИЕ. Работа на GCC 4.6, без C++ 0x флаги, внешние ограничения Я также заинтересован в том, что произойдет с C++ 11 и/или более поздние компиляторы)шаблона вычисления аргументов
I имеют шаблонный класс для работы над матрицами фиксированного размера:
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);
}
}
идея заключается в том, что, если число ber позиций для смещения больше, чем общее количество строк, может быть возвращена матрица, заполненная значением по умолчанию. Однако в тех случаях (numRowsUp >= rows
) компиляция заканчивается внутренней ошибки компилятора: в force_constant_size на gimplify.c: 691 на последней строке кода .joinV(temp)
Матрица размеров во время процесса (мое предположение):
- Возвращаемое значение: (строки х смещ_по_столбцев) матричные
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
Вы пробовали новую версию компилятора? – PlasmaHH
О, извините ... Я забыл упомянуть, что мы ограничены gcc 4.6 без флагов C++ 0x: P – dunadar
Я бы перешел к частичной специализации на дополнительном логическом параметре, который бы получил 'numRowsUp> = rows' как значение. – AProgrammer