3

原因がわからないエラーが発生しました。

基本的にこのエラーになると思います:

 error: no matching function for call to ‘std::basic_ostream<char>::operator<<(const std::basic_string<char>&)’

www.cplusplus.comで仕様を調べたところ、引数としてstd::ostream::operator<<withの定義がないと実際に書かれています。std::string

私の質問は、 と書くとどうなるかということstd_ostream_instance << std_fancy_string;です。std::out << std::string("Hello world!")の次によくある呼び出しの 1 つだと思いますconst char*

エラーは次の行から発生します。

template<typename T> 
void Log::_log(const T& msg)
{  _sink->operator<<( msg ); }

_sinkstd::ostream* いくつかのラッピング関数がありますが、ここで壊れています。

書くことで回避できると思います

template<> 
void Log::_log<std::string>(const std::string& msg) {
  _sink->operator<<( msg.c_str() );
}

ostream& operator<< (ostream& out, const unsigned char* s );デフォルトで定義されているためです。

のような単純な使用法で明らかに機能するため、自動的に推測されない理由はわかりませんcout << any_std_string

これが関連しているかどうかはわかりませんが、.log で処理できるもの以外は、ログ関数を介して渡すことができるようにしたいと考えていますstd::ostreamlog(const T& anything_to_log)テンプレート化されていない明示的な宣言を使用しましたが、それをリファケートするためにテンプレートに移動することにしました。オーバーロードが 5 つ以上あるのは馬鹿げているように思えました。のようなものをコンパイルしようとすると、エラーが発生しますLog::log( std::string("test case") )

ばかげた単純なもののように見えますが、自分で取得することはできません。スタックをグーグル検索して無駄に検索しようとしました。

よろしく、luk32。

PS。回避策を確認しましたが、動作します。暗黙のうちに行われないのはなぜですか?

4

2 に答える 2

9

operator <<オーバーロードはのメンバーではありませんostream。たとえば、これらは独立した機能です。

ostream& operator << ( ostream& out, const basic_string<T>& bs );

試す

template<typename T> 
void Log::_log(const T& msg)
{  *_sink << msg;  }
于 2012-09-14T12:56:13.060 に答える
5

バージョンはメンバー関数ではないため、のstd::stringメンバーとして呼び出すことはできません_sink。メンバー バージョンと非メンバー バージョンの両方を取得するには、次の方法を試してください (実際、メンバー バージョンが必要になることはまずありません)。

#include <iostream>
#include <string>

int main()
{
    std::ostream * os = &std::cout;
    std::string s = "Hello\n";

    // This will not work
    // os->operator<<(s);
    (*os) << s;

    return 0;
}

または、参照として保存_sinkし、通常どおりに出力することをお勧めしますcout

于 2012-09-14T12:59:59.033 に答える