错误:无法拨打'(家庭)电话

时间:2014-01-31 22:01:44

标签: c++

所以基本上我有一个错误对我来说毫无意义。我已经尝试了一切,但似乎没有任何工作,所以我认为你们可以帮助我。顺便提一下,这是我在这个网站上的第一篇文章。

我正在开发一个程序,涉及一个名为“household.cc,h”的类和一个测试程序。

这是Household.h(有问题的代码)

class Household{
public:


    // Default constructor
    Household(std::string nme, std::string adrs, int peeps, int ncome);
    Household();

    Household(std::string& nme, std::string& adrs, int& peeps, int& ncome);

这是我的Household.cc文件

// constructors

Household::Household(std::string nme, std::string adrs, int peeps, int ncome){
    name = nme;
    address = adrs;
    numpeople = peeps;
    income = ncome;
    }

Household::Household(std::string& nme, std::string& adrs, int& peeps, int& ncome){
    name =nme;
    address = adrs;
    numpeople=peeps;
    income=ncome;
}


Household::Household(){
    name = "";
    address = "";
    numpeople = 0;
    income =0;
}

并且有问题的测试类代码是:

Household temp; 
string n; 
int i; 

cout<< "Please enter the name, press enter, then the income of the house\n";
            getline(cin, n);
            cin >>  i;
            myWard.removeHouse(temp(n, n, i, i));
            break;

错误消息是

Error: no match for call to '(Household) (std:string&, std::string&, int&, int&)'

我真的不明白为什么会发生这种情况,因为我的Household构造函数确实拥有所有这些参数。我可能会遗漏一些明显的东西但对我来说并不那么明显。这是我第一次使用c ++。

编辑:removeHouse和myWard在这个问题上无关紧要,但我添加了临时代码。问题是代码

temp(n,n,i,i) 

那是错误的地方。

提前致谢!

3 个答案:

答案 0 :(得分:1)

您使用默认构造函数 temp 对象初始化,然后稍后您尝试使用其他构造函数<重新初始化它/ strong> ..这就是问题。

Household temp;  <-- initialized with DEFAULT constructor
string n; 
int i; 

cout<< "Please enter the name, press enter, then the income of the house\n";
            getline(cin, n);
            cin >>  i;
            myWard.removeHouse(temp(n, n, i, i)); <-- RE-initialize?? Bad idea..
            break;

使用您想要的构造函数初始化对象(我认为是4参数),然后使用该对象。

另外:gcc可能正在被使用,它会警告你,使用这组参数,没有可用的解决方案。

这样的事可能有用:

string n; 
int i; 

// do initialize n and i to something meaningful here

Household temp(n, n, i, i);

cout<< "Please enter the name, press enter, then the income of the house\n";
            getline(cin, n);
            cin >>  i;
            myWard.removeHouse(temp);
            break;

我对其他功能以及程序的行为一无所知。

答案 1 :(得分:1)

表达式temp(n, n, i, i)不会“重新调用”构造函数,这就是您尝试执行的操作。相反,该表达式尝试在operator()对象上调用函数应用程序运算符temp。你没有为你的班级提供这样的操作员,所以编译器正确地抱怨。

您无法重新调用对象的构造函数。但可以做的是等待声明对象,直到你确实需要它为止,然后在那里调用构造函数:

{
  cout<< "Please enter the name, press enter, then the income of the house\n";
  getline(cin, n);
  cin >>  i;
  Household temp(n, n, i, i);
  myWard.removeHouse(temp);
}
break;

我添加了大括号,因为此代码看起来像是switch语句的一部分。在switch块的中间声明变量,因为此代码现在可以使用temp,可能会导致问题;大括号限制了新变量的范围。

答案 2 :(得分:0)

我相信这可能是因为你有两个构造函数只是因为它需要引用而不同。

编译器认为它不明确并且不知道要调用哪个构造函数;因此“不匹配”。