Reputation: 47
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
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
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
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
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