невозможно определить причину ошибки компиляции "нет соответствия для оператора <'" - PullRequest
3 голосов
/ 24 сентября 2010

Я использую реализацию CodeSourcery библиотеки обработки изображений векторного сигнала ( vsipl ++ ). Я написал функцию, которая должна возвращать [I + a * A] ^ - 1 B, где I - единичная матрица, а A и B - совместимые квадратные матрицы следующим образом:

namespace vsipl {

template< class T1, class T2, class O1, class O2, class L1, class L2,
     template< dimension_type, class, class, class > class B1,
     template< dimension_type, class, class, class > class B2 >
Matrix< typename Promotion< T1, T2 >::type, 
        B1< 2, typename Promotion< T1, T2 >::type, O1, L1 > > 
inv_mult( typename Promotion< T1, T2 >::type a, 
       Matrix< T1, B1< 2, T1, O1, L1 > > const& A,
       Matrix< T2, B2< 2, T2, O2, L2 > > const& B
     ) 
{
 typedef typename Promotion< T1, T2 >::type value_type;
 typedef Matrix< value_type, B1< 2, value_type, O1, L1 > > ret_type;
 typedef lud< value_type, by_reference > lud_type;

 ret_type ret(A.size(0),A.size(1),0), denom(A.size(0),A.size(1),0);

 //I + a*A
 denom.diag() = 1;
 denom = denom + a*A;

 lud_type ld( denom.size() );
 ld.decompose( denom );

 //as a side effect of using LAPACK as a back end, this requires a template
 //param to indicate precisely what is being solved.
 ld.solve< mat_ntrans >( B, ret );  // <--- Line generating error.

 return ret;
}//inv_mult
}//vsipl

Для ясности, в vsipl ++ Matrices принимают два параметра: тип и блок, который описывает, как хранится информация. Блок является причиной шаблона супа, выше. Кроме того, объект lud выполняет разложение LU для матрицы A, а затем решает Ax = b, используя разложенную форму A.

Когда я пытаюсь скомпилировать это с помощью gcc (как 4.2.1 на MacO 10.6 и 4.3.0 на Fedora 9), я получаю следующую ошибку

error: no match for 'operator<' in 'ld.vsip::lud<T, by_reference>::solve [with 
 vsip::mat_op_type tr = tr, Block0 = Block0, Block1 = Block1, T = double] < mat_ntrans

Я попытался упростить код, исключив тип Promotion, требуя один тип данных и блок, и я получаю ту же ошибку.

Есть мысли?

1 Ответ

3 голосов
/ 24 сентября 2010

попробуй

ld.template solve< mat_ntrans >

объяснение , потому что то же самое сделало меня сумасшедшим

...