独自のロギング クラスを作成し、それをストリームとして使用しようとしています。
logger L;
L << "whatever" << std::endl;
これは私が始めたコードです:
#include <iostream>
using namespace std;
class logger{
public:
template <typename T>
friend logger& operator <<(logger& log, const T& value);
};
template <typename T>
logger& operator <<(logger& log, T const & value) {
// Here I'd output the values to a file and stdout, etc.
cout << value;
return log;
}
int main(int argc, char *argv[])
{
logger L;
L << "hello" << '\n' ; // This works
L << "bye" << "alo" << endl; // This doesn't work
return 0;
}
しかし、コンパイルしようとすると、operator<< (std::endl を使用する場合) の定義がないというエラーが発生しました。
pruebaLog.cpp:31: error: no match for ‘operator<<’ in ‘operator<< [with T = char [4]](((logger&)((logger*)operator<< [with T = char [4]](((logger&)(& L)), ((const char (&)[4])"bye")))), ((const char (&)[4])"alo")) << std::endl’
だから、私はこの種のストリームを受け入れるために operator<< をオーバーロードしようとしましたが、それは私を怒らせています。やり方がわかりません。たとえば、ostream ヘッダー ファイルの std::endl の定義を調べて、このヘッダーを使用して関数を作成しました。
logger& operator <<(logger& log, const basic_ostream<char,char_traits<char> >& (*s)(basic_ostream<char,char_traits<char> >&))
しかし、運がありません。char を直接使用する代わりに、テンプレートを使用して同じことを試しました。また、単純に「const ostream& os」を使用してみましたが、何も試しませんでした。
私を悩ませているもう1つのことは、エラー出力で、operator<<の最初の引数が変更されることです。ポインターへの参照である場合もあれば、二重参照のように見える場合もあります...