¿Por qué no el código Blitz ++ compilar?
-
22-08-2019 - |
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 ...).
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;