0

error.h と error.cpp の 2 つのファイルがあります。でコンパイル

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代わりに のコンストラクタを使用します。

std::string(msg)

ただし、このテンポラリは参照引数にバインドできないことに注意してください。あなたはそれを修正する必要があります。

多分このように:

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

または const-ref を使用します。

于 2013-01-29T21:29:25.423 に答える
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コンストラクターが使用されます。したがって、別のコンストラクターは必要ありません。

于 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 に答える