Pregunta

Soy un novato bombardeo ++. Hasta ahora, todo bien, pero estoy un poco desconcertado por qué la línea comentada en el código siguiente falla al compilar 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

Estoy en Debian / Lenny (g ++ 4.3.2, Blitz 0.9). Aquí está el código:

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

Me gusta estar const-ed hasta la empuñadura, por lo que sería bueno saber si hay una manera de conseguir que funcione (experiencia con Blitz ++ hasta ahora sugiere que podría ser una cuestión de escoger el derecho incluye ...).

¿Fue útil?

Solución

he tenido un vistazo al código fuente de Blitz ++. Por sorprendente que pueda parecer, no es no constructor plantilla para TinyMatrix, pero hay una plantilla = operador. Eso significa que no se puede hacer lo que usted está tratando de hacer. Así que me gustaría sugerir olvidarse de su matriz siendo const . O encontrar otra manera como la creación de una matriz no constante que pasaría como una referencia constante como parámetro de una función.

Ahora, sólo por diversión, lo cierto es que podría copiar operador de plantilla = código () y hacer una nueva plantilla de constructor en el interior Blitz / tinymat.h fuera de él, pero no lo haría! Si realmente que desee, así es como:

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

y su código se compila (y probablemente funciona).

Otros consejos

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

lo siento, no sé bombardeo, pero algunas ideas que podrían ayudar.

¿El bombardeo :: TinyMatrix tienen constructores adecuados?
Tal vez trate de la otra forma de constructor de copia

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

es la aplicación de la palabra clave const estándar muy apropiado? Tal vez lo que necesite

typedef blitz::TinyMatrix<const double,3,3> const_m33;
typedef blitz::ConstTinyMatrix<double,3,3> const_m33;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top