2009-03-30 11 views
0

Ich bin ein Blitz ++ Neuling. So weit, so gut, aber ich bin ein wenig verwirrt, warum der Kommentar gesetzt Zeile im Code unten mitWarum kompiliert dieser Blitz ++ Code nicht?

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 

ich auf Debian/Lenny bin kompilieren fehlschlägt (g ++ 4.3.2, Blitz 0,9). Hier ist der Code:

#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; 
} 

Ich mag const-ed auf den Griff sein, also, es wäre schön zu wissen, ob es einen Weg gibt es immer so weit zu arbeiten (Erfahrung mit Blitz ++ schlägt vor, es könnte nur eine Frage der Auswahl der richtigen beinhaltet ...).

+0

könnte es funktionieren, Const m33 d zu tun (Blitz :: Produkt (a, b)); (nur eine Vermutung, ich weiß nicht Blitz) –

+0

Nicht gut ... Ich habe das versucht; gleicher Fehler – timday

Antwort

2

Ich habe mir den Quellcode von Blitz ++ angesehen. So überraschend wie es scheinen mag, gibt es keine Vorlagenkonstruktor für TinyMatrix, aber es gibt eine Vorlage = Operator. Das bedeutet, dass Sie nicht tun können, was Sie versuchen zu tun. Also würde ich vorschlagen, zu vergessen, dass Ihre Matrix const ist. Oder finden Sie einen anderen Weg wie das Erstellen einer nichtkonstanten Matrix, die Sie als eine Konstante als Parameter einer Funktion übergeben würden.

Nun, zum Spaß, die Wahrheit ist, Sie könnten Vorlage Operator =() kopieren und einen neuen Template-Konstruktor in Blitz/tinymat.h daraus machen, aber ich würde nicht! Wenn Sie wirklich zu wollen, gehen Sie wie folgt:

// 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 
} 

und Ihr Code kompiliert (und wahrscheinlich funktionieren).

0

Entschuldigung weiß Blitz nicht, aber einige Ideen, die helfen könnten.

Hat der Blitz :: TinyMatrix entsprechende Konstruktoren?
Vielleicht versuchen die andere Form von Copykonstruktor

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

ist das Standard-Schlüsselwort const Anwendung wirklich angemessen? Vielleicht brauchen Sie vielleicht

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); 
Verwandte Themen