2013-06-19 131 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