Frage

Ich bin ein blitz ++ Neuling. So weit, so gut, aber ich bin ein wenig verwirrt, warum der Kommentar gesetzt Zeile in dem folgenden Code zu kompilieren, schlägt mit

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 bin auf Debian / Lenny (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, so wäre es schön, zu wissen, ob es einen Weg, um es (Erfahrung mit Blitz ++ zu arbeiten bisher schon sagt, es könnte nur eine Frage der richtigen Kommissionierung sein beinhaltet ...).

War es hilfreich?

Lösung

Ich habe einen Blick auf den Quellcode Blitz ++ hatte. So überraschend es auch scheinen mag, ist es nicht Vorlage Konstruktor für TinyMatrix, aber es ist eine Vorlage = Operator. Das bedeutet, dass Sie nicht tun können, was Sie zu tun versuchen. So würde ich vorschlagen, über Ihre Matrix zu vergessen ist const . Oder einen anderen Weg finden, wie eine nicht konstante Matrix erstellen, die Sie als konstante Referenz als Parameter einer Funktion übergeben würde.

Jetzt, nur zum Spaß, die Wahrheit könnte man Template Operator = () Code kopieren und eine neue Vorlage Konstruktor innerhalb blitz / tinymat.h daraus zu machen, aber ich würde nicht! Wenn Sie auf wirklich 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 funktioniert).

Andere Tipps

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

leider nicht wissen, blitz, aber einige Ideen, die helfen können.

Hat den blitz :: TinyMatrix haben entsprechenden Bauer?
Vielleicht versuchen, die andere Form von Copykonstruktor

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

Ist die Anwendung des Standard-Schlüsselwort const wirklich angemessen? Vielleicht müssen Sie

typedef blitz::TinyMatrix<const double,3,3> const_m33;
typedef blitz::ConstTinyMatrix<double,3,3> const_m33;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top