不匹配运算符重载

时间:2013-05-27 04:25:38

标签: c++ templates operator-overloading type-conversion

我用这个成员函数重载了* =运算符:

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

我还有一个像matriz这样的构造函数:

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仍然不起作用。

有什么想法吗?如果您需要更多代码,可以将它放在这里。

3 个答案:

答案 0 :(得分:2)

使下面的陈述有效:

A *= vec;

您需要另一个operator*=矢量类型:

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

构造函数将对新构造的对象进行操作但不会转换现有对象,例如,下面的语句应该有效:

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

请参阅live sample

答案 1 :(得分:1)

你可能会这样做

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

现在运营商

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

也是如下的构造函数

Matriz(const conv& vec);

编辑2:
否则你可以这样做

构造函数的

使用此

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

之后你可以使用

A *= vec; 

因为它会调用op,因此operator *=(A,Matriz<vector>(vec));不需要编辑1或之前。

答案 2 :(得分:0)

如果您不想定义另一个运算符'=',则以下代码就可以了。

A *= Matriz<double>(vec).