1

ロギング用の汎用クラスを作成しています

  1. ログに記録する文字列でファンクターとして呼び出すことができます
  2. いくつかの情報(システム時間、ログレベルなど)で文字列を充実させます
  3. << 演算子を実装する出力クラスにログ メッセージを渡します。この「出力チャネル」は、構築時に定義できます。

コード:

template<class Writer>
class Logger
{
public:
Logger(Writer* writer);
~Logger(void);

void operator() (char level, std::string message);

private:
Writer* writer;
};

template<class Writer>
Logger<Writer>::Logger(Writer* writer)
    : writer(writer)
{
}

template<class Writer>
Logger<Writer>::~Logger(void)
{
}

template<class Writer>
void Logger<Writer>::operator ()(char level, std::string message) {

    /* do something fancy with the message */
    /* ... */
    /* then write to output channel */

    this->writer << message;
}

ただし、コンパイル時に「テンプレート引数を推定できませんでした」というエラーが表示されます。エラーが発生する行は

this->writer << message;

私は C++ テンプレートにはかなり慣れていません。むしろ、力の C# 側から来ています...何か提案はありますか?

前もって感謝します...

4

1 に答える 1

3

の左オペランドとしてポインタを使用していますoperator <<:

this->writer << message;
//    ^^^^^^

ポインターを使用する場合は、次のようにする必要があります。

*(this->writer) << message; 

または、さらに良いこと (ポインターが null にならないように、クラスLoggerが常に に関連付けられている必要がある場合)、ポインターを参照に置き換えます。Writerwriter

template<class Writer>
class Logger
{
public:
    Logger(Writer& writer);
//         ^^^^^^^
    // ...
private:
    Writer& writer;
//  ^^^^^^^
};

これにより、元のバージョンの呼び出し演算子を使用して、次のように書くことができます。

this->writer << message;

operator <<の適切なオーバーロードが存在するという仮定の下では、もちろんこれはすべて正しいです。

于 2013-06-19T13:28:32.020 に答える