【问题标题】:Getting no match for operator overloaded重载运算符无法匹配
【发布时间】:2013-05-27 04:25:38
【问题描述】:

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

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

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

【问题讨论】:

  • 如果你的重载是一个全局函数(不能从你的粘贴中理解),它将失败。您可以考虑将其设为类方法。
  • 是类方法。
  • 那么你应该重载*= 以vector 作为参数?A*=vec; 应该嵌入对类似operator*=(A,vec); 的调用,其中vec 的类型是vector
  • 变量 A 的实例化似乎很奇怪。试试这样的:Matriz&lt;double&gt; A = Matriz&lt;double&gt;(vec)
  • @Leandro 到目前为止的答案都是正确的,但是您的基本问题为什么编译器没有执行隐式转换尚未得到解决。线程C++ implicit type conversion with template 回答了它。

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


【解决方案1】:

要使以下语句起作用:

A *= vec;

你需要另一个 operator*= 来表示向量类型:

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

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

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

live sample

【讨论】:

  • 但是如果我将向量传递给带有矩阵的运算符,为什么不将其转换为矩阵?看,有一个接收向量的构造函数。
  • +1 这正是我所说的。或者他可以采用另一个模板参数来告诉应该乘以的类型。
  • @Leandro 你正在乘法而不是在那里构造任何东西。没有您期望的默认转换。
  • 这个解决方案我也试过了。没关系,效果很好,但我想知道为什么如果没有运算符重载,我就无法做到。
  • 是的,但是,如果我通过一个 int 来乘以一个 double 它工作正常...我想做这样的事情。
【解决方案2】:

你可以这样做

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

现在运营商是

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

还有下面的构造函数

Matriz(const conv& vec);

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

构造函数使用this

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

之后就可以使用了

A *= vec; 

因为它会调用 op,所以 operator *=(A,Matriz&lt;vector&gt;(vec)); 不需要 EDIT 1 或在此之前。

【讨论】:

  • 我制作了一个没有模板的版本,甚至 A*=vec 也能正常工作...可能问题出在模板上。
  • 知道如何向编译器显示它没问题......它可以使用该方法吗?
  • 可能需要另一个模板参数来指定要相乘的类型
  • @Leandro 查看 EDIT2,您可能会发现它很有用。
  • 这个解决方案的问题是我将有一个接收所有内容的构造函数。所以可以试试 Matriz(int a)。
【解决方案3】:

如果不想再定义一个运算符'=',下面的代码就可以了。

A *= Matriz<double>(vec).

【讨论】:

    猜你喜欢
    • 2018-07-19
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    • 2017-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多