Domanda

Sono un principiante blitz di ++. Fin qui, tutto bene, ma io sono un po 'disorientato perché la linea commentata nel seguente codice non riesce a compilare con

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

Sono su Debian / Lenny (g ++ 4.3.2, Blitz 0.9). Ecco il codice:

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

mi piace essere const-ed fino in fondo, quindi sarebbe bello sapere se c'è un modo di farla funzionare (esperienza con Blitz ++ suggerisce finora potrebbe essere solo una questione di scegliere il diritto include ...).

È stato utile?

Soluzione

Ho avuto uno sguardo al codice sorgente del Blitz ++. Per quanto sorprendente possa sembrare, non v'è non modello di costruzione per TinyMatrix, ma c'è un modello di operatore =. Ciò significa che non si può fare ciò che si sta cercando di fare. Quindi io suggerirei di dimenticare il tuo matrice essere const . Oppure trovare un altro modo come la creazione di una matrice non-const che si sarebbe passare come riferimento const come parametro di una funzione.

Ora, solo per divertimento, la verità è che si potrebbe copiare gli operatori di template = codice () e fare un nuovo costruttore modello all'interno Blitz / tinymat.h fuori di esso, ma non vorrei! Se davvero vuole, ecco come:

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

e il codice compila (e probabilmente funziona).

Altri suggerimenti

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

mi dispiace non so Blitz, ma alcune idee che potrebbero aiutare.

Fa il blitz :: TinyMatrix avere costruttori appropriati?
Forse provare l'altra forma di costruttore di copia

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

sta applicando davvero appropriato la parola chiave const norma? Forse potrebbe essere necessario

typedef blitz::TinyMatrix<const double,3,3> const_m33;
typedef blitz::ConstTinyMatrix<double,3,3> const_m33;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top