2013-06-19 133 views
1

我正在写日志的通用类C++不能推导出模板参数

  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# - 侧来了...有什么建议?

预先感谢您...

+1

你应该展示你如何调用Logger :: operator()' –

+2

我没有理由在这里使用指针而不是引用。 – soon

+0

是啊,你是对的,谢谢你......只是把它改成参考。 – mbue

回答

3

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

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

如果你想使用一个指针,你应该然后做:

*(this->writer) << message; 

甚至更​​好(只要Logger类必须始终与Writer关联,以便指针writer应该ne版本为空),与参考替换指针:

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

这将允许您使用原来的电话运营商的版本,并写上:

this->writer << message; 

现在,这一切当然是在存在operator <<的适当超载的假设下正确。

+1

或者将'writer'改为引用而不是指针。 –

+0

@LucTouraille:或许更好,是的。我会提到的,谢谢 –

+0

谢谢,我应该看到:) – mbue