我是一个闪电战++新手。到目前为止,这么好,但我有点神秘,为什么下面的代码中注释掉的行无法编译
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
我在Debian / Lenny(g ++ 4.3.2,Blitz 0.9)。 这是代码:
#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;
}
我确实想要成为剑柄,所以很高兴知道是否有办法让它发挥作用(使用Blitz ++的经验到目前为止表明它可能只是选择正确的包括...)。
答案 0 :(得分:2)
我看过Blitz ++的源代码。 尽管看起来很令人惊讶,但是TinyMatrix还有没有模板构造函数,但是有一个template =运算符。 这意味着你无法做你想做的事。所以我建议忘记你的矩阵 const 。或者找到另一种方法,比如创建一个非const矩阵,你将作为const引用作为函数的参数传递。
现在,只是为了好玩,事实是你可以复制模板operator =()代码并在blitz / tinymat.h中创建一个新的模板构造函数,但我不会!如果您真的想要,请按以下方式进行:
// 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
}
并且您的代码编译(并且可能有效)。
答案 1 :(得分:1)
//const m33 d=blitz::product(a,b); // Fails to compile.
const m33 d;
const_cast<m33>(d) = blitz::product(a,b);
答案 2 :(得分:0)
blitz :: TinyMatrix是否有合适的构造函数? 也许尝试其他形式的复制构造函数
const m33 d( blitz::product(a,b) );
应用标准const关键字真的合适吗?也许你可能需要
typedef blitz::TinyMatrix<const double,3,3> const_m33;
typedef blitz::ConstTinyMatrix<double,3,3> const_m33;