Pergunta

Eu sou uma blitz ++ novato. Tão longe, tão bom, mas eu sou um pouco perplexo por que a linha comentada no código abaixo não compilação com

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

Eu estou no Debian / Lenny (g ++ 4.3.2, Blitz 0,9). Aqui está o 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;
}

Eu gosto de ser const-ed ao máximo, de modo que seria bom saber se há uma maneira de fazê-la funcionar (experiência com Blitz ++ até agora sugere que poderia ser apenas uma questão de escolher o direito inclui ...).

Foi útil?

Solução

Eu tive uma olhada no código fonte de Blitz ++. Por mais surpreendente que possa parecer, existe não construtor modelo para TinyMatrix, mas há um template = operador. Isso significa que você não pode fazer o que você está tentando fazer. Então eu sugiro esquecendo sua matriz sendo const . Ou encontrar outra maneira como a criação de uma matriz não-const que você iria passar como uma referência const como o parâmetro de uma função.

Agora, apenas por diversão, a verdade é que você pode copiar operador de template = código () e fazer um novo construtor de modelo dentro Blitz / tinymat.h fora dele, mas eu não faria isso! Se você realmente quer, veja 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
}

e seus compila código (e provavelmente funciona).

Outras dicas

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

desculpe não sei Blitz, mas algumas idéias que podem ajudar.

Será que a blitz :: TinyMatrix ter construtores apropriados?
Talvez tente a outra forma de construtor de cópia

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

está aplicando a palavra-chave const padrão realmente apropriado? Talvez você pode precisar

typedef blitz::TinyMatrix<const double,3,3> const_m33;
typedef blitz::ConstTinyMatrix<double,3,3> const_m33;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top