[英]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.