繁体   English   中英

C ++“重载函数的调用不明确”编程错误

[英]C++ “call of overloaded function is ambiguous” programming error

我在代码中遇到“歧义的调用错误”,我无法检测到它,我认为该错误在addressBookType类中,但是我将能够检测到它!

由于这些错误,我必须重新发布此问题?

Compiler: MinGW GCC 4.6.2 32-bit
Executing  g++.exe...
g++.exe "D:\New Folder\Cpp\Assignment 4\q4\main.cpp" -o "D:\New Folder\Cpp\Assignment 4\q4\main.exe"    -I"E:\Program Files\Dev-Cpp\MinGW32\include"  -I"E:\Program Files\Dev-Cpp\MinGW32\include"   -L"E:\Program Files\Dev-Cpp\MinGW32\lib" -L"E:\Program Files\Dev-Cpp\MinGW32\lib" -static-libstdc++ -static-libgcc 
D:\New Folder\Cpp\Assignment 4\q4\main.cpp: In constructor 'addressBookType::addressBookType()':
D:\New Folder\Cpp\Assignment 4\q4\main.cpp:318:34: error: call of overloaded 'addressType()' is ambiguous

D:\New Folder\Cpp\Assignment 4\q4\main.cpp:318:34: note: candidates are:
D:\New Folder\Cpp\Assignment 4\q4\main.cpp:104:1: note: addressType::addressType(std::string, std::string, std::string, std::string)

D:\New Folder\Cpp\Assignment 4\q4\main.cpp:88:3: note: addressType::addressType()
D:\New Folder\Cpp\Assignment 4\q4\main.cpp:318:34: error: call of overloaded 'extPersonType()' is ambiguous

D:\New Folder\Cpp\Assignment 4\q4\main.cpp:318:34: note: candidates are:
D:\New Folder\Cpp\Assignment 4\q4\main.cpp:168:1: note: extPersonType::extPersonType(std::string, std::string)
D:\New Folder\Cpp\Assignment 4\q4\main.cpp:154:3: note: extPersonType::extPersonType()

Execution terminated

这是我的代码:

#include<iostream>
#include<cstdlib>
#include<fstream>
#include<string>

using namespace std;

//////////////////////////////"personType" is from D.S Malik Course Website
////////////***Class person Start


class personType
{
public:
     void print() const;
       //Function to output the first name and last name
       //in the form firstName lastName.


    void setName(string first, string last);
      //Function to set firstName and lastName according 
      //to the parameters.
      //Postcondition: firstName = first; lastName = last

    string getFirstName() const;
      //Function to return the first name.
      //Postcondition: The value of firstName is returned.

    string getLastName() const;
      //Function to return the last name.
      //Postcondition: The value of lastName is returned.

    personType(string first, string last);
      //Constructor
      //Sets firstName and lastName according to the parameters.
      //The default values of the parameters are null strings.
      //Postcondition: firstName = first; lastName = last  

 private:
    string firstName; //variable to store the first name
    string lastName;  //variable to store the last name
};
/////////Class person End***///////////
// IMPLEMENTATION OF "PersonType" CLASS  //

///////////////// IMP START ////////////////////
personType::personType(string first="",string last=""){

}

void personType::setName(string first,string last){
    firstName=first;
    lastName=last;

}

string personType::getFirstName() const{

return firstName;
}

string personType::getLastName () const{
return lastName;
}

void personType::print() const{
    cout<<firstName<<" "<<lastName<<endl;
}
////////////////// IMP END ////////////////////



/////////////////////////////////////////////////////////////////////////////////////////////


////////***class addressType Start

class addressType{


    private:
    string stAddress;
    string city;
    string state;
    string zipcode;

    public:
        addressType();
        addressType(string,string,string,string);
        void setAddress(string);
        string getAddress();
        void setCity(string);
        string getCity();
        void setState(string);
        string getState();
        void setZipcode(string);
        string getZipcode();

};

// IMPLEMENTATION OF "addressType" CLASS  //

///////////////// IMP START ////////////////////
addressType::addressType(string=" ",string=" ",string=" ",string=" "){

}

void addressType::setAddress(string addr){
    stAddress=addr;
}

string addressType::getAddress(){
    return stAddress;
}

void addressType::setCity(string cit){
    city=cit;
}

string addressType::getCity(){
    return city;
}

void addressType::setState(string sta){
    state=sta;
}

string addressType::getState(){
    return state;
}

void addressType::setZipcode(string zip){
    zipcode=zip;
}

string addressType::getZipcode(){
    return zipcode;
}
///////////////// IMP END ////////////////////

//////////class addressType End***
/////////////////////////////////


//////////////////////////////////
//////***class extPersonType Start
class extPersonType {

    private:
        string relation;
        string phNo;

    public:
        extPersonType();
        extPersonType(string,string);
        void setRelation(string);
        string getRelation();
        void setphNo(string);
        string getphNo();


};


// IMPLEMENTATION OF "extPersonType" CLASS   //
///////////////// IMP START ////////////////////

extPersonType::extPersonType(string =" " ,string = " "){

}

void extPersonType::setRelation(string rel){
    relation=rel;
}

string extPersonType::getRelation(){
    return relation;
}

void extPersonType::setphNo(string ph){
    phNo=ph;
}

string extPersonType::getphNo(){
    return phNo;
}

///////////////// IMP END ////////////////////
//////////class extPersonType End***

///////////////////////////////////////////////////////////////////////////////////////////


//////////////////////////////"dateType" is from D.S Malik Course Website
////////***class DateType Start

class dateType
{
public:
    void setDate(int month, int day, int year);
      //Function to set the date.
      //The member variables dMonth, dDay, and dYear are set 
      //according to the parameters.
      //Postcondition: dMonth = month; dDay = day;
      //               dYear = year

    int getDay() const;
      //Function to return the day.
      //Postcondition: The value of dDay is returned.

    int getMonth() const;
      //Function to return the month.  
      //Postcondition: The value of dMonth is returned.

    int getYear() const;
      //Function to return the year.     
      //Postcondition: The value of dYear is returned.

    void printDate() const;
      //Function to output the date in the form mm-dd-yyyy.

    dateType(int month = 1, int day = 1, int year = 1900);
      //Constructor to set the date
      //The member variables dMonth, dDay, and dYear are set 
      //according to the parameters.
      //Postcondition: dMonth = month; dDay = day; dYear = year;
      //               If no values are specified, the default 
      //               values are used to initialize the member
      //               variables.

private:
    int dMonth; //variable to store the month
    int dDay;   //variable to store the day
    int dYear;  //variable to store the year
};
//////////class dateType End***
/////////////////////////////////


// IMPLEMENTATION OF "DateType" CLASS   //
///////////////// IMP START ////////////////////

void dateType::setDate(int month, int day, int year)
{
    dMonth = month;
    dDay = day;
    dYear = year;
}

int dateType::getDay() const 
{
    return dDay;
}

int dateType::getMonth() const 
{
    return dMonth;
}

int dateType::getYear() const 
{
    return dYear;
}

void dateType::printDate() const
{
    cout << dMonth << "-" << dDay << "-" << dYear;
}

    //Constructor with parameters
dateType::dateType(int month, int day, int year) 
{ 
    dMonth = month;
    dDay = day;
    dYear = year;
}
//////////////// IMP END /////////////////////

////////////////////////////////////////////////////////////////////////////////


//////***class addressBookType Start

class addressBookType {

private:
    string FirstName; //variable to store the first name
    string LastName;  //variable to store the last name
    string StAddress;

    string City;
    string State;
    string Zipcode; 
    string Relation;
    string PhNo;
    int DMonth; //variable to store the month
    int DDay;   //variable to store the day
    int DYear;  //variable to store the year

protected:

    addressType obj1;
    dateType obj2;
    extPersonType obj3;

public:
    addressBookType();
    static int count;
    void loadData(addressBookType *&ptr);

};

//////////class addressType End***
/////////////////////////////////

// IMPLEMENTATION OF "addressBookType" CLASS   //
///////////////// IMP START ////////////////////
addressBookType::addressBookType(){

}
void addressBookType::loadData(addressBookType *&ptr){

    ifstream fin;
    ifstream fout;

    string tempName;
    cout<<"Enter file name:"<<endl;


            if(!fin){

                cout<<"Cannot open the image file : "<<endl;
                cout<<"Input Failure"<<endl;
                system("pause");


            }

            else{

                for(int i=0;!fin.eof();i++){

                    fin>>FirstName;
                    fin>>LastName;
                    fin>>DDay;
                    fin>>DMonth;
                    fin>>DYear;
                    getline(fin,StAddress);
                    getline(fin,City);
                    getline(fin,State);
                    fin>>Zipcode;
                    fin>>PhNo;
                    fin>>Relation;

                    cout<<FirstName<<LastName<<DDay<<DMonth<<DYear<<StAddress<<City<<State<<Zipcode<<PhNo<<Relation<<endl;

                }

            }   

}

int main (){

     addressBookType *ptr;
     addressBookType obj;
     ptr=new addressBookType[500];
     obj.loadData(ptr);

     system("pause");
     return(0);
}

~Please help

这就是问题:

addressType();
addressType(string,string,string,string);
...

addressType::addressType(string=" ",string=" ",string=" ",string=" "){

您要声明两个构造函数,但是第二个构造函数具有所有参数的默认值。 因此,如果您调用addressType() ,则它可以是第一个无参数的构造函数,也可以是第二个(将所有参数设置为默认值)。

因为您似乎永远都不会实现第一个构造函数,所以简单的解决方法就是删除声明。

您已经声明了一个不带参数的构造函数,以及一个所有参数默认均为null的构造函数。 当您调用构造函数且不传递任何参数时,编译器将不知道是否要使用无参数的参数,还是不希望使用多参数的参数,而是为所有参数传递了null

问题是您的addressType类中有2个冲突的构造函数:

addressType();
addressType(string,string,string,string);

您在定义中为第二个声明了默认值:

addressType::addressType(string=" ",string=" ",string=" ",string=" "){

}

并且应该删除它们:

addressType::addressType(string,string,string,string){

}

这两个函数原型是无法区分的:

addressType::addressType(); 
addressType::addressType(string=" ",string=" ",string=" ",string=" "); 

通过默认构造函数(与extPersonType相同)创建addressType对象时

=" "表示如果未显式提供参数,则使用=后的值(也称为默认参数值)。 因此,在这种情况下,对addressType()的调用要么是没有参数的函数,要么是其所有参数都设置为" "的另一个函数-编译器无法确定您的意思是哪个并引发错误。

要修复,请(至少)从第二个功能的第一个参数中删除默认值

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM