2013-06-27 2 views
1

(ПРИМЕЧАНИЕ. Работа на 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

+1

Вы пробовали новую версию компилятора? – PlasmaHH

+0

О, извините ... Я забыл упомянуть, что мы ограничены gcc 4.6 без флагов C++ 0x: P – dunadar

+1

Я бы перешел к частичной специализации на дополнительном логическом параметре, который бы получил 'numRowsUp> = rows' как значение. – AProgrammer

ответ

0

Что случилось с препроцессором MAX? Вы можете использовать MAX(0, rows-numRowsUp) в качестве аргумента шаблона. Или попробуйте это как аргумент шаблона: (numRowsUp>=rows)? 0 : rows-numRowsUp. Таким образом, неправильный шаблон никогда не будет внедрен.

+0

Что ... Я бы поклялся, что попробовал это, и компилятор закричал на меня. Есть ли какое-либо требование, чтобы использовать правильный MAX? – dunadar