C ++无法推断出模板参数

时间:2013-06-19 13:24:37

标签: c++ templates

我正在编写一个用于记录的通用类

  1. 可以作为带有记录字符串的仿函数调用
  2. 使用一些信息(系统时间,日志级别......)来丰富字符串
  3. 将日志消息传递给输出类,该输出类实现<<运营商。这个“输出通道”可以在构造时定义。
  4. 代码:

    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#-force of force ...有什么建议吗?

    提前谢谢你......

1 个答案:

答案 0 :(得分:3)

您正在使用指针作为operator <<的左操作数:

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

如果你想使用指针,你应该这样做:

*(this->writer) << message; 

甚至更好(假设Logger类必须始终与Writer关联,以便writer指针永远不应为null),请用引用替换指针:

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

这将允许您使用原始版本的呼叫运算符,并写入:

this->writer << message;

现在所有这一切当然都是正确的,假设存在适当的operator <<重载。