Почему этот код 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, 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++ до сих пор предполагает, что это может быть просто вопрос выбора правильных включений…)).
3 ответа
Я взглянул на исходный код Blitz++. Как это ни удивительно, для TinyMatrix нет конструктора шаблонов, но есть оператор template =. Это означает, что вы не можете делать то, что пытаетесь сделать. Поэтому я бы посоветовал забыть о том, что ваша матрица постоянна. Или найдите другой способ, например, создать неконстантную матрицу, которую вы передадите в качестве константной ссылки в качестве параметра функции.
Теперь, просто для удовольствия, правда в том, что вы можете скопировать код шаблона 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
}
и ваш код компилируется (и, вероятно, работает).
//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;