0

我有两个文件:error.h 和 error.cpp。编译

g++ -std=c++0x

给我一个错误:

error.cpp:9:33:**call of overloaded "to_string(char*&)" is ambiguous**

我该如何解决这个问题?

错误.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

错误.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 }
4

5 回答 5

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

旁注:您的所有函数参数最好采用 const 参考:

Error(int pos, const std::string& msg);
void setMsg(int pos, const std::string& msg);
于 2013-01-29T21:31:44.997 回答
2

改用string's 构造函数:

std::string(msg)

但是请注意,这个临时变量不能绑定到引用参数。你必须解决这个问题。

也许是这样的:

Error::Error(int pos, char* msg) {
   std::string str(msg);
   setMsg(pos, msg);
}

或者使用 const-ref。

于 2013-01-29T21:29:25.423 回答
2

to_string()用于不是字符串内容(例如 a long、 anint等)转换为string. 你有一个char*,它是一个 C 字符串,你想做的是用string它创建一个对象,而不是转换它。

您的编译器抱怨歧义,因为它找不到to_string()您传递给它的类型的版本 ( char*),考虑到该函数的目的,这是有道理的。

如果你声明你的参数string const&而不是string&在相应的重载中setMsg()(以及在构造函数中Error),你可以通过传递 C 字符串直接调用它:一个临时类型string将被自动创建并绑定到setMsg().

这样,您甚至可以摆脱for C 字符串的特定重载,setMsg()实际上它除了转发之外什么都不做。

于 2013-01-29T21:39:09.933 回答
1

删除Error(int pos, char* msg)并更改剩余的构造函数setMsg()

Error(int pos, const std::string& msg);
...
void setMsg(int pos, const std::string& msg);

当您Error()使用 a 调用时char*,它将自动使用std::string构造函数。因此,不需要单独的构造函数。

于 2013-01-29T21:32:00.267 回答
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){
于 2013-01-29T21:35:52.697 回答