Youmair
Youmair

Reputation: 47

C++ "call of overloaded function is ambiguous" programming error

I am facing "ambiguous call error" in my code and i am unable to detect it I think the error is in addressBookType class but i would be able to detect it!

I have to repost this question due to these errors? "

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

Here is my code:

#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

Upvotes: 0

Views: 15829

Answers (4)

Thomas
Thomas

Reputation: 181705

This is the problem:

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

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

You're declaring two constructors, but the second one has default values for all parameters. So if you call addressType(), it could either be the first, parameterless constructor, or the second, with all arguments set to their defaults.

As you seem to never implement the first constructor anyway, the easy fix is just to remove the declaration.

Upvotes: 13

Attila
Attila

Reputation: 28762

These two function prototypes are indistinguishable:

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

when you are creating an addressType object via the default constructor (same with extPersonType)

The =" " notation means that if a parameter is not provided explicitly, the value after the = is used (also known as default parameter value). So in this case the call to addressType() could be either the function that has no parameters, or the other function with all its parameters set to " " -- the compiler cannot decide which one you meant and throws an error.

To fix, remove the default value from (at least) the first parameter of the second function

Upvotes: 0

Roger Lipscombe
Roger Lipscombe

Reputation: 91805

You've declared a constructor that takes no parameters and a constructor where all of the parameters default to null. When you call the constructor and pass no arguments, the compiler doesn't know whether you want the no-parameter one, or whether you want the multiple-parameter one, but with null passed for all the arguments.

Upvotes: 4

Luchian Grigore
Luchian Grigore

Reputation: 258548

The problem is that you have 2 conflicting constructors in your addressType class:

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

You declared default values for the second one in the definition:

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

}

and you should remove them:

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

}

Upvotes: 1

Related Questions