原因がわからないエラーが発生しました。
基本的にこのエラーになると思います:
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 ); }
_sink
std::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::ostream
。log(const T& anything_to_log)
テンプレート化されていない明示的な宣言を使用しましたが、それをリファケートするためにテンプレートに移動することにしました。オーバーロードが 5 つ以上あるのは馬鹿げているように思えました。のようなものをコンパイルしようとすると、エラーが発生しますLog::log( std::string("test case") )
。
ばかげた単純なもののように見えますが、自分で取得することはできません。スタックをグーグル検索して無駄に検索しようとしました。
よろしく、luk32。
PS。回避策を確認しましたが、動作します。暗黙のうちに行われないのはなぜですか?