我是突击++新手。到目前为止,一切都很好,但我有点困惑,为什么在下面的代码中注释掉线失败,编译

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 /莱尼(克++ 4.3.2,闪电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;
}

我不喜欢为const-ED的剑柄,所以它会是不错的知道是否有得到它的工作的方式(用突击++迄今为止的经验表明,它可能只是采摘权包括事宜...)。

有帮助吗?

解决方案

我有一看闪电++的源代码。 作为令人惊讶的,因为它看起来,存在的没有模板TinyMatrix构造,但有一个模板=运算符。 这意味着,你不能做你正在尝试做的。所以,我建议忘记了你的矩阵是的常量的。或可以用别的方式,如创建一个非const矩阵将传递作为const引用作为函数的参数。

现在,只是为了好玩,但事实是,你可以复制模板运算符=()代码,使一个新的模板的构造热捧/ 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
}

和您的代码编译(可能工作)。

其他提示

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

不好意思不知道热捧,但一些想法,可能会有帮助。

请问热捧:: 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;
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top