2009-03-30 34 views
0

私はblitz ++初心者です。これまでのところ、とても良いが、私は以下のコードでコメントアウト行がなぜこの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 

でコンパイルに失敗した理由を私はDebianの/レニー(G ++ 4.3.2、ブリッツ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になるのが好きです(ブリッツ++での経験は、今のところそれがあります示唆しますちょうど右のピックの問題が含まれています...)。

+0

const m33 d(blitz :: product(a、b)); (唯一の推測私は暴動を言う) –

+0

いいえ...私はそれを試みた;同じエラー。 – timday

答えて

2

私は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 
} 

とあなたのコードのコンパイル(そしておそらく動作します):あなたはが本当にがしたい場合は、ここでは方法です。

0

申し訳ありませんが、ブリッツを知っているが、役立ついくつかのアイデア。

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; 
1
//const m33 d=blitz::product(a,b); // Fails to compile. 
const m33 d; 
const_cast<m33>(d) = blitz::product(a,b); 
関連する問題