我有两个文件:error.h和error.cpp。使用
进行编译g++ -std=c++0x
给了我一个错误:
error.cpp:9:33:**call of overloaded "to_string(char*&)" is ambiguous**
我该如何解决这个问题?
error.h:
1 #ifndef ERROR_H_GUARD
2 #define ERROR_H_GUARD
4 #include <string>
6 class Error {
7 public:
8 Error(int pos, std::string& msg);
10 Error(int pos, char* msg);
12 const char* what() throw();
14 private:
15 std::string msg;
17 void setMsg(int pos, std::string& msg);
18 };
19
20 #endif
error.cpp:
2 #include "error.h"
4 Error::Error(int pos, std::string& msg){
5 setMsg(pos, msg);
6 }
8 Error::Error(int pos, char* msg) {
9 setMsg(pos, std::to_string(msg));
10 }
12 const char* Error::what() throw() {
13 return msg.c_str();
14 }
16 void Error::setMsg(int pos, std::string& msg){
17 this->msg = std::to_string(pos) + msg + std::string("\n") + std::string(pos - 1, ' ') + std::string("^");
18 }
答案 0 :(得分:3)
std::to_string将整数作为参数,但是您将指针传递给它。
Error::Error(int pos, char* msg) {
setMsg(pos, std::to_string(msg));
}
您不需要将字符串翻译为字符串,请尝试:
Error::Error(int pos, char* msg) {
setMsg(pos, std::string(msg));
}
Side注意:所有的函数参数最好采用const引用:
Error(int pos, const std::string& msg);
void setMsg(int pos, const std::string& msg);
答案 1 :(得分:2)
改为使用string
的构造函数:
std::string(msg)
但请注意,此临时不能绑定到引用参数。你必须解决这个问题。
也许是这样的:
Error::Error(int pos, char* msg) {
std::string str(msg);
setMsg(pos, msg);
}
或者使用const-ref。
答案 2 :(得分:2)
to_string()
用于转换 not 字符串的内容(例如long
,int
等。进入string
。你有一个char*
,这是一个C字符串,你想要做的是从中创建一个string
对象,而不是转换它。
您的编译器抱怨歧义,因为它找不到您传递给它的类型to_string()
的版本char*
,这是有道理的,考虑到目的那个功能。
如果您在string const&
的相应重载(以及string&
的构造函数中)中声明了参数setMsg()
而不是Error
,则可以直接调用它通过传递C字符串:将自动创建类型string
的临时表并绑定到setMsg()
的参数。
通过这种方式,您甚至可以摆脱setMsg()
的特定重载
答案 3 :(得分:1)
删除Error(int pos, char* msg)
并将剩余的构造函数和setMsg()
更改为
Error(int pos, const std::string& msg);
...
void setMsg(int pos, const std::string& msg);
当您使用Error()
致电char*
时,它会自动使用std::string
构造函数。因此,不需要单独的构造函数。
答案 4 :(得分:1)
这不起作用:
Error::Error(int pos, char* msg) {
setMsg(pos, std::to_string(msg));
}
因为std::to_string()
需要数字值进行转换。你可能意味着:
Error::Error(int pos, char const * msg) {
setMsg(pos, msg);
}
这与std::string&
版本完全相同(反过来,应该是std::string const &
),因此您实际上可以删除此char*
构造函数(维护的代码较少:奖金)!
还有:
void Error::setMsg(int pos, std::string& msg){
应该是这样的:
void Error::setMsg(int pos, std::string const & msg){