Вопрос

Я новичок в блиц++.Пока все хорошо, но я немного озадачен, почему закомментированная строка в коде ниже не может скомпилироваться с

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++ подсказывает, что это может быть просто вопрос выбора правильных включений... ).

Это было полезно?

Решение

Я просмотрел исходный код 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
}

и ваш код компилируется (и, вероятно, работает).

Другие советы

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

извините, не знаю блиц, но есть некоторые идеи, которые могут помочь.

Есть ли у 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;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top