Question

Je suis un blitz ++ débutant. Jusqu'à présent, si bon, mais je suis un peu mystifié pourquoi commenté la ligne dans le code ci-dessous ne compiler avec

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

Je suis sur Debian / Lenny (g ++ 4.3.2, Blitz 0,9). Voici le 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;
}

J'aime être const-ed à fond, il serait bien de savoir s'il y a un moyen de le faire fonctionner (expérience avec Blitz ++ jusqu'à présent suggèrent qu'il pourrait être une question de choisir le droit comprend ...).

Était-ce utile?

La solution

J'ai eu un coup d'oeil au code source de Blitz ++. Aussi surprenant que cela puisse paraître, il est pas de constructeur de modèle pour TinyMatrix, mais il y a un template = opérateur. Cela signifie que vous ne pouvez pas faire ce que vous essayez de faire. Je propose donc oublier au sujet de votre matrice étant const . Ou trouver une autre façon comme la création d'une matrice non-const que vous passeriez comme référence const comme paramètre d'une fonction.

Maintenant, juste pour le plaisir, la vérité est que vous pouvez copier le code opérateur template = () et faire un nouveau constructeur de modèle à l'intérieur blitz / tinymat.h sur, mais je ne! Si vous vraiment veulent, voici comment:

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

et votre code compile (et fonctionne probablement).

Autres conseils

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

désolé ne sais pas blitz, mais quelques idées qui pourraient aider.

Est-ce que le blitz :: TinyMatrix ont des constructeurs appropriés?
Peut-être essayer l'autre forme de constructeur de copie

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

est l'application du mot-clé standard const vraiment approprié? Peut-être que vous pourriez avoir besoin

typedef blitz::TinyMatrix<const double,3,3> const_m33;
typedef blitz::ConstTinyMatrix<double,3,3> const_m33;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top