I am trying to make a code applying function overload. The two functions are supposed to be distinguished by the type of input and output variables. (The user either inputs an element symbol (std::string) and gets the atomic number (int) or vice-versa). I tried to apply this to my code, but I get the error message that the call of the overloaded function is ambiguous. I don't understand what I could change; as I have my code now, I am converting the variables applying to the given case to the correct type, so why is it still ambiguous?
The error I get is:
/var/lib/cxrun/projectfiles/main.cpp: In function 'int main()': /var/lib/cxrun/projectfiles/main.cpp:40:48: error: call of overloaded 'lookup(int)' is ambiguous (std::string)output = lookup(std::stoi(input)); ^ /var/lib/cxrun/projectfiles/main.cpp:25:13: note: candidate: 'std::__cxx11::string lookup(int)' std::string lookup(int atomicNumber); ^~~~~~ /var/lib/cxrun/projectfiles/main.cpp:12:15: note: candidate: 'std::__cxx11::string exercises::lookup(int)' std::string lookup(int atomicNumber); ^~~~~~ /var/lib/cxrun/projectfiles/main.cpp:45:48: error: call of overloaded 'lookup(std::__cxx11::string)' is ambiguous std::stoi(output) = lookup((std::string)input); ^ /var/lib/cxrun/projectfiles/main.cpp:24:5: note: candidate: 'int lookup(std::__cxx11::string)' int lookup(std::string name); ^~~~~~ /var/lib/cxrun/projectfiles/main.cpp:11:7: note: candidate: 'int exercises::lookup(std::__cxx11::string)' int lookup(std::string name); ^~~~~~
// use functions from the standard library (like cout)
#include <iostream>
#include <cctype>
#include <string>
#include <iomanip>
// to avoid name-clashes, create a namespace
namespace exercises
{
  // add elements + lookup functionality
  int lookup(std::string name);
  std::string lookup(int atomicNumber);
  
} /* end of namespace exercises */
// I want to use the functions from our new namespace...
using namespace exercises;
//arrays
std::string t[4] = {"H", "Rh", "Cl", "C"};
int s[4] = {1, 45, 17, 6};
//Function declarations
int lookup(std::string name);
std::string lookup(int atomicNumber);
int main(void)
{
//declare input and output variable as string temporarily 
std::string input;
std::string output;
//lookup something
std::cout << "Enter element or atomic number to look up:" << std::endl;
std::cin >> input;
//if input is atomic number, make it of type integer to match function input type
if(std::isdigit(input[0])){
  //std::stoi(input);
  (std::string)output = lookup(std::stoi(input));
}
//else, make output of type integer
else{
  //std::stoi(output);
  std::stoi(output) = lookup((std::string)input);
};
//std::string output;
//output = lookup(input);
if(std::isdigit(output[0])){
  if(std::stoi(output) == 1){
    std::cout << "Invalid input!" << std::endl;
  };
  return 0;
};
if(output == "error"){
  std::cout << "Invalid input!" << std::endl;
  return 0;
}
//print output
std::cout << "|**Sample Input**|**Sample Output**|" << std::endl;
std::cout << "|" << std::setfill('-') << std::setw(16) << "|" << std::setfill('-') << std::setw(16) << "|" << std::endl;
std::cout << "|" << std::left << std::setw(16) << input << "|" << std::left << std::setw(16) << output << "|" << std::endl;
return 0;
}
//function definition element symbol --> atomic number
int lookup(std::string input){
  int output; 
  //check if input is valid, ie if exists in array t
  for(unsigned int i=0; i<sizeof(t); i++){
    if(input == t[i]){
      output = s[i];
      
  return output;
    };
  };
  output = 1;
  return output;
}
  
//function definition atomic number --> element symbol
std::string lookup(int input){
  //check if input is valid, ie if exists in array s
  for(unsigned int i=0; i<sizeof(s); i++){
    if(input == s[i]){
      std::string output;
      output = t[i];
      
  return output;
    };
  };
  std::string output = "error";
  return output;
}
 
 
    