на основе приведенного здесь примера http://www.boost.org/doc/libs/release/libs/utility/operators.htm#example я реализовал следующий производный класс boost::numeric::ublas::vector
:
namespace Chebyshev
{
template<typename T>
class function_data : public boost::numeric::ublas::vector<T>,
boost::addable<function_data<T> >,
boost::subtractable<function_data<T> >,
boost::multipliable2<function_data<T>, T>,
boost::dividable2<function_data<T>, T>
{
public:
char dataflag;
function_data() : boost::numeric::ublas::vector<T>() {dataflag=0;} ///< The default empty constructor
function_data(const boost::numeric::ublas::vector<T>& vec) : boost::numeric::ublas::vector<T>(vec) {dataflag=0;} ///< The copy constructor without a flag.
function_data(const boost::numeric::ublas::vector<T>& vec, char flag) : boost::numeric::ublas::vector<T>(vec), dataflag(flag) {} ///< The copy constructor with a flag.
~function_data() {} ///< The destructor.
function_data<T>& operator= (const boost::numeric::ublas::vector<T>& in) {boost::numeric::ublas::vector<T>::operator=(in); return *this;} ///< The assignment operator from a boost::numeric::ublas::vector<T>.
function_data<T>& operator= (const function_data<T>& in) {boost::numeric::ublas::vector<T>::operator=(in); dataflag=in.dataflag; return *this;} ///< The assignment operator.
function_data<T>& operator+= (const function_data<T>& in) {this->boost::numeric::ublas::vector<T>::operator+=(in); this->dataflag=this->dataflag; return *this;}
function_data<T>& operator-= (const function_data<T>& in) {this->boost::numeric::ublas::vector<T>::operator-=(in); this->dataflag=this->dataflag; return *this;}
function_data<T>& operator*= (T in) {this->boost::numeric::ublas::vector<T>::operator*=(in); this->dataflag=this->dataflag; return *this;}
function_data<T>& operator/= (T in) {this->boost::numeric::ublas::vector<T>::operator/=(in); this->dataflag=this->dataflag; return *this;}
friend std::ostream& operator<< (std::ostream& os, const function_data<T>& fd) {os << "[type " << fd.dataflag << "] " << static_cast<boost::numeric::ublas::vector<T> >(fd); return os;} ///< The << operator.
};
}
Однако компиляция следующего фрагмента кода
int main( int argc, char ** argv)
{
Chebyshev::function_data<std::complex<double> > u;
/* some stuff putting values in u */
std::cout << u*2 << std::endl;
return 0;
}
выдает предупреждение «ISO C++ говорит, что они неоднозначны, хотя наихудшее преобразование для первого лучше, чем наихудшее преобразование для второго» и продолжает выдавать версию ublas vector_expression (с u
приведенным как своего рода vector_expression) и мой версия (с 2
отлитой как const std::complex<double>&
).
Я хотел бы иметь возможность использовать смешанную арифметику в своем классе, как в приведенном выше фрагменте кода, но объяснение на сайте boost::operators мне непонятно. Что мне нужно добавить или изменить в моем классе, чтобы разрешить это?
Кроме того, в этом примере в списке наследования каждый класс находится внутри последних >
предыдущего класса. Я не вижу никакой разницы в выводе компилятора, пишу ли я так или так, как указано выше. Как правильно написать?
С уважением, Бретт.
class function_data
наследоватьboost::numeric::ublas::vector<T>
? Не может ли он просто иметь член типаboost::numeric::ublas::vector<T>
? - person yasouser   schedule 01.06.2011function_data<T>
, как если бы это былboost::numeric::ublas::vector<T>
с дополнительным флагом, указывающим тип (не тип данных ;-)) хранящихся в нем данных. - person Brett Ryland   schedule 01.06.2011...vector<T>
членом function_data и реализую операторы, необходимые для сложения, вычитания, умножения2 и делимости2, будет ли это автоматически разрешать смешанную арифметику в моем классе function_data? - person Brett Ryland   schedule 01.06.2011class function_data<T>
действует как оболочка для...ublas::vector<T>
. - person yasouser   schedule 01.06.2011>
s в примере? Это просто выбор стиля форматирования или есть какая-то заметная разница в реализации? - person Brett Ryland   schedule 01.06.2011