繁体   English   中英

C++ 重载调用 function 不明确

[英]C++ Call of overloaded function is ambiguous

我正在尝试编写一个应用 function 过载的代码。 这两个函数应该通过输入类型和 output 变量来区分。 (用户要么输入元素符号(std::string)并获得原子序数(int),反之亦然)。 我试图将此应用于我的代码,但我收到错误消息,即重载 function 的调用不明确。 我不明白我可以改变什么; 因为我现在有我的代码,我正在将应用于给定案例的变量转换为正确的类型,那么为什么它仍然模棱两可?

我得到的错误是:

/var/lib/cxrun/projectfiles/main.cpp:在 function 'int main()':/var/lib/cxrun/projectfiles/main.cpp:40:48:错误:调用重载的 'lookup(int)'是模棱两可的(std::string)输出=查找(std::stoi(输入)); ^ /var/lib/cxrun/projectfiles/main.cpp:25:13:注意:候选:'std::__cxx11::string lookup(int)' std::string lookup(int atomicNumber); ^~~~~~ /var/lib/cxrun/projectfiles/main.cpp:12:15: 注意: 候选: 'std::__cxx11::string exercise::lookup(int)' std::string lookup(int原子数); ^~~~~~ /var/lib/cxrun/projectfiles/main.cpp:45:48: 错误:调用重载的'lookup(std::__cxx11::string)' 不明确std::stoi(output) =查找((标准::字符串)输入); ^ /var/lib/cxrun/projectfiles/main.cpp:24:5: 注意:候选:'int lookup(std::__cxx11::string)' int lookup(std::string name); ^~~~~~ /var/lib/cxrun/projectfiles/main.cpp:11:7: 注意:候选:'int exercise::lookup(std::__cxx11::string)' int lookup(std::string姓名); ^~~~~~

// 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;
}
 

您的问题是您在命名空间excercises中声明了函数,然后添加了using namespace exercises; ,然后在默认命名空间中再次声明它们。 由于 using 指令,编译器不知道要引用哪个版本的声明,是在命名空间内声明的还是在默认命名空间中声明的。

命名空间exercises中声明的函数仍未定义,您只需定义默认命名空间中的函数。

尝试先在不使用命名空间的情况下解决问题,然后添加命名空间但不要使用using namespace声明。

暂无
暂无

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

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