代码之家  ›  专栏  ›  技术社区  ›  timday

为什么Blitz++代码不能编译?

  •  0
  • timday  · 技术社区  · 17 年前

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

    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;
    }
    

    3 回复  |  直到 17 年前
        1
  •  2
  •   Benoît photo_tom    17 年前

    我看过Blitz++的源代码。 尽管看起来令人惊讶,但有 TinyMatrix的模板构造函数,但有一个template=运算符。 这意味着你不能做你想做的事情。所以我建议忘记你的矩阵 常量 。或者找到另一种方法,比如创建一个非常量矩阵,将其作为常量引用作为函数的参数传递。

    现在,只是为了好玩,事实是你可以复制模板运算符=()代码,并在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
    }
    

    你的代码编译(并且可能工作)。

        2
  •  1
  •   John John    17 年前
    //const m33 d=blitz::product(a,b);  // Fails to compile.
    const m33 d;
    const_cast<m33>(d) = blitz::product(a,b);
    
        3
  •  0
  •   Greg Domjan    17 年前

    抱歉,我不知道闪电战,但有些想法可能会有所帮助。

    闪电战: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;