0

我是闪电战++新手。到目前为止,一切都很好,但我有点困惑为什么下面代码中的注释行无法编译

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++ 的经验表明,这可能只是选择正确的包括... )。

4

3 回答 3

2

我看过 Blitz++ 的源代码。令人惊讶的是,TinyMatrix没有模板构造函数,但有一个模板 = 运算符。这意味着你不能做你想做的事。所以我建议忘记你的矩阵是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
}

并且您的代码可以编译(并且可能有效)。

于 2009-03-30T18:06:56.977 回答
1
//const m33 d=blitz::product(a,b);  // Fails to compile.
const m33 d;
const_cast<m33>(d) = blitz::product(a,b);
于 2009-06-07T17:15:36.807 回答
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;
于 2009-03-30T15:53:49.260 回答