调用重载的to_string不明确

时间:2013-01-29 21:27:37

标签: c++ c++11

我有两个文件: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 }

5 个答案:

答案 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 字符串的内容(例如longint等。进入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){