문제

나는 Blitz ++ 초보자입니다. 지금까지 너무 좋았지 만 아래 코드의 댓글이 든 줄이 컴파일하지 못하는 이유가 약간 신비 롭습니다.

error: conversion from ‘blitz::_bz_tinyMatExpr<blitz::_bz_tinyMatrixMatrixProduct<double, double, 3, 3, 3, 3, 1, 3, 1> >’ to non-scalar type ‘const m33’ requested

나는 데비안/레니 (G ++ 4.3.2, Blitz 0.9)에 있습니다. 코드는 다음과 같습니다.

#include <blitz/blitz.h>
#include <blitz/array.h>
#include <blitz/matrix.h>
#include <blitz/matexpr.h>
#include <blitz/tinymat.h>
#include <blitz/tinymatexpr.h>
#include <blitz/tinyvec.h>
#include <blitz/tinyvec-et.h>
#include <blitz/vector.h>
#include <blitz/vector-et.h>

typedef blitz::TinyVector<double,3> v3;
typedef blitz::TinyMatrix<double,3,3> m33;

int main(int,char**)
{
  const m33 a;
  const m33 b;
  m33 c;c=blitz::product(a,b);  // Compiles OK
  //const m33 d=blitz::product(a,b);  // Fails to compile.
  return 0;
}

나는 칼자루에 대한 const-ed를 좋아하기 때문에 그것을 작동시키는 방법이 있는지 아는 것이 좋을 것입니다. ).

도움이 되었습니까?

해결책

Blitz ++의 소스 코드를 살펴 보았습니다. 놀랍게 보일 수 있습니다 아니요 TinyMatrix의 템플릿 생성자이지만 템플릿 = 연산자가 있습니다. 그것은 당신이하려는 일을 할 수 없다는 것을 의미합니다. 그래서 나는 당신의 매트릭스 존재를 잊어 버릴 것을 제안합니다 Const. 또는 함수의 매개 변수로서 const 참조로 전달되는 비 초가 행렬을 만드는 것과 같은 다른 방법을 찾으십시오.

이제 재미를 위해, 진실은 템플릿 연산자 = () 코드를 복사하고 blitz/tinymat.h 내부에서 새 템플릿 생성자를 만들 수 있다는 것입니다. 만약 너라면 진짜 여기에 다음과 같은 방법이 있습니다.

// Turn the following code...

template<typename T_expr>
TinyMatrix<T_numtype, N_rows, N_columns>&
operator=(_bz_tinyMatExpr<T_expr> expr)
{
    // USEFUL CODE
    return *this;
}

// ...into this :
template<typename T_expr>
TinyMatrix(_bz_tinyMatExpr<T_expr> expr)
{
    // USEFUL CODE
}

그리고 당신의 코드는 컴파일됩니다 (그리고 아마도 작동).

다른 팁

//const m33 d=blitz::product(a,b);  // Fails to compile.
const m33 d;
const_cast<m33>(d) = blitz::product(a,b);

죄송합니다 Blitz를 모르지만 도움이 될만한 아이디어.

Blitz :: TinyMatrix에는 적절한 생성자가 있습니까?
아마도 다른 형태의 카피 생성자를 시도해보십시오

const m33 d( blitz::product(a,b) );

표준 Const 키워드를 적용하는 것이 실제로 적절합니까? 아마도 당신은 필요할 것입니다

typedef blitz::TinyMatrix<const double,3,3> const_m33;
typedef blitz::ConstTinyMatrix<double,3,3> const_m33;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top