【问题标题】:no matching function for call to ' '调用 ' ' 没有匹配的函数
【发布时间】:2013-02-27 13:55:46
【问题描述】:

我被赋予实现功能:

 "static double distanta (const Complex&, const Complex&);"

返回两个复数之间的距离。函数的定义在 Complex 类中,我已经这样实现了:

double Complex::distanta(const Complex &a, const Complex &b)
{    
    double x = a.real() - b.real();
    double y = a.imag() - b.imag();

    return sqrt(x * x + y * y);
}

据我所知,静态函数只能访问静态成员,而我的类只有

double _re;
double _im;

作为数据成员。

在主函数中,我将其称为:

#include <iostream>
#include "complex.h"

using namespace std;

int main()
{
    Complex* firstComplexNumber; 
    firstComplexNumber = new Complex(81, 93);

    cout << "Numarul complex este: " << *firstComplexNumber << endl;

    Complex* secondComplexNumber;
    secondComplexNumber = new Complex(31, 19);

    cout << "Distanta dintre cele doua numere" <<endl << endl;
    Complex::distanta(firstComplexNumber, secondComplexNumber);
    return 0;
}

我得到的错误是:

错误:没有匹配函数调用 'Complex::distanta(Complex*&, Complex*&)'

你能告诉我我做错了什么吗? 谢谢!

【问题讨论】:

  • Complex::distanta 是静态方法吗?
  • 您能否发帖SSCCE 以便我们重现该问题?
  • 您将两个对象实例传递给静态方法,因此如果它们被公开,则对这些实例成员进行操作应该没有问题。
  • 只要定义为静态双远距离(const Complex&, const Complex&);在我看来这是一个静态的。
  • 静态方法根本无法访问this,但在这种情况下应该不成问题。所有a.real()b.imag() 等都不需要this

标签: c++


【解决方案1】:

当您的函数需要引用 (const Complex&amp;) 时,您正在传递指针 (Complex*)。引用和指针是完全不同的东西。当函数需要引用参数时,您需要直接将对象传递给它。引用只表示不复制对象。

要让一个对象传递给你的函数,你需要取消引用你的指针:

Complex::distanta(*firstComplexNumber, *secondComplexNumber);

或者让你的函数接受指针参数。

但是,我不会真正建议上述任何一种解决方案。由于您在这里不需要动态分配(并且您正在泄漏内存,因为您没有 delete 所拥有的 newed),因此最好不要首先使用指针:

Complex firstComplexNumber(81, 93);
Complex secondComplexNumber(31, 19);
Complex::distanta(firstComplexNumber, secondComplexNumber);

【讨论】:

  • @Teodora 让我猜猜,Java 还是 C# 经验? new 仅用于 C++ 中的动态生命周期数据,应谨慎使用。哦,如果 sfrabbit 的答案解决了您的问题,请勾选答案。
  • @Teodora 现在可以工作了,但你明白为什么吗?另外,当你完成它们时,不要忘记从堆中删除你的对象。
  • 不,我一点经验都没有,这是我写 c++ 的第二天 ..我在大学的第一年,直到现在还没有学习计算机科学。
  • 或多或少我猜,是的。
  • @Teodora 然后,您应该更仔细地重新阅读 sftrabbit 的回复,并研究引用、取消引用和指针。完成后,您还需要将对象从堆中删除。如果这包含在循环中,您将造成严重的内存泄漏。
【解决方案2】:

您正在尝试在需要引用的地方传递指针(您不要删除,从而导致内存泄漏)。您在这里并不需要指针:

Complex firstComplexNumber(81, 93);
Complex secondComplexNumber(31, 19);

cout << "Numarul complex este: " << firstComplexNumber << endl;
//                                  ^^^^^^^^^^^^^^^^^^ No need to dereference now

// ...

Complex::distanta(firstComplexNumber, secondComplexNumber);

【讨论】:

  • This^ 没有理由在堆上创建 firstComplexNumber 和 secondComplexNumber。如果您确实在堆上创建它们,最好记住在完成后删除它们。
  • @crush:我想我确实指出了这一点。还是我错过了什么?
  • 这就是为什么我开始说This^。我的评论是注释,而不是批评。
猜你喜欢
  • 2017-10-16
  • 1970-01-01
  • 2021-09-21
  • 2016-11-23
  • 2016-08-08
  • 2014-03-12
  • 2015-03-17
  • 2018-08-04
  • 2012-05-27
相关资源
最近更新 更多