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; 

或者更好(假设一个Logger类必须始终与 a 相关联Writer,以便writer指针永远不应该为空),用引用替换指针:

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

这将允许您使用呼叫操作员的原始版本,并编写:

this->writer << message;

现在,在存在适当的过载的假设下,所有这些当然是正确的operator <<

于 2013-06-19T13:28:32.020 回答