我是个blitz++新手。到目前为止,一切都很好,但是我有点困惑,为什么下面代码中注释掉的行不能编译成
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,blitz0.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++的经验表明,这可能只是一个选择正确的问题,包括...)。
发布于 2009-03-30 18:06:57
我已经看过Blitz++的源代码了。令人惊讶的是,没有用于TinyMatrix的模板构造函数,但有一个=运算符。这意味着你不能做你想做的事情。所以我建议忘记你的矩阵是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
}这样你的代码就可以编译了(并且很可能还能工作)。
发布于 2009-06-07 17:15:37
//const m33 d=blitz::product(a,b); // Fails to compile.
const m33 d;
const_cast<m33>(d) = blitz::product(a,b);发布于 2009-03-30 15:53:49
对不起,不知道闪电战,但一些想法可能会有所帮助。
闪电战::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;https://stackoverflow.com/questions/697711
复制相似问题