2013-05-27 2 views
2

я перегрузил * = оператор с помощью этой функции члена:не Getting не подходят для оператора перегружена

template<class U> 
Matriz<T> & operator*=(const Matriz<U> & valor); 

А также у меня есть конструктор Матриз так:

Matriz(const std::vector<T> & vector); 

Ну, я хотел бы чтобы сделать что-то вроде этого:

double vetor[3] = { 1, 2, 3 }; 
std::vector<double> vec(vetor, vetor + 3); 
Matriz<double> A("src//imatriz.dat"); //Creates a matrix with parameters from a file. 
A*=vec; 

То есть, я хотел бы умножить матрицу на вектор. Проблема в том, что компилятор возвращает, что для оператора нет соответствия.

--- EDIT2 ---

Как было предложено, я также попытался это:

template<class U> 
friend Matriz<T> & operator*=(Matriz<U> & lhs, const Matriz<U> & rhs) 

но A * = VEC до сих пор не работает.

Любая идея? Если вам нужно больше кода, нет никаких проблем, чтобы поместить его здесь.

+0

Если ваша перегрузка является глобальной функцией (не могу понять из вашей пасты), она не удастся. Вы можете рассмотреть возможность применения метода класса. – diegoperini

+0

Это метод класса. –

+0

, тогда вы должны перегрузить '* =' брать вектор в качестве параметра? 'A * = vec;' должен встраивать вызов в нечто вроде этого 'operator * = (A, vec);' где vec имеет тип vector . –

ответ

2

Чтобы сделать ниже работы заявление:

A *= vec; 

Вам нужен другой operator*= для векторного типа:

template<class U> 
Matriz<U> & operator*=(const std::vector<U> & valor); 

конструктор будет работать на новом построенном объекте, но не будет преобразовывать существующий объект, например, ниже заявление должно работать:

A*=std::vector<double>(vetor, vetor + 3); 

см. live sample

+0

Но если я передаю вектор оператору с матрицей, почему бы не преобразовать его в матрицу? См., Есть конструктор, который получает вектор. –

+0

+1 это именно то, что я также сказал. или может быть, он может принять другой параметр шаблона, который сообщает тип, который следует умножить. –

+0

@ Leandro вы умножаете и ничего не строите там. конверсия по умолчанию отсутствует, как вы ожидаете. –

0

Если вы не хотите определять другой оператор '=', следующий код в порядке.

A *= Matriz<double>(vec). 
+0

Да, это работает ... Я уже знаю это, но я хочу это A * = vec ... –

1

вы могли бы, возможно, сделать это

template<typename T, typename conv = std::vector<T> > //for the Matriz class 

Теперь оператор

Matriz<T>& operator *= (const conv& vec); 

также конструктор, как показано ниже

Matriz(const conv& vec); 

EDIT 2:
вам могли бы сделать это иначе

для использования конструктора этого

template<typename TYPE2MUL> 
Matriz(const TYPE2MUL& var) 

после этого вы можете использовать

A *= vec; 

, потому что он не будет вызывать ор, как так operator *=(A,Matriz<vector>(vec)); нет необходимости в EDIT 1 или до этого.

+0

Я сделал версию без шаблона и работает даже A * = vec ... возможно, проблема связана с шаблонами. –

+0

ах да его возможно. –

+0

Любая идея, как показать компилятор, что все в порядке ... что он может использовать этот метод? –

Смежные вопросы