2012-01-12 106 views
2

懶惰的評價我有記錄的一類,一定不能繼承的std :: ostream的,並具有運營商< <爲同一類型定義爲標準輸出流PLUS模板化的版本:的模板函數參數

class MyLoggingClass { 
[...] 
public: 
    template<typename T> MyLoggingClass & operator<<(T& data){ ... } 
} 

而且,在我的程序每打印類,我有典型的非成員函數定義:

std::ostream & operator << (std::ostream & os, const OneOfMyClasses & foo); 

的事情是,在內部,我的記錄器有時使用的標準輸出流,這就是:

template<typename T> 
MyLoggingClass & operator<<(T& data) 
{ 
    [...] 
    if(someCondition) 
    { 
     cout << data; 
    } 
    [...] 
} 

多虧了這一點,我可以登錄我的課沒有明確地複製在每個人的非成員運算< <的MyLoggingClass。 這個問題是在一條線在那裏我嘗試登錄創建的對象「對飛」:

MyLoggingClass logger; 
logger << OneOfMyClasses(params); // Here I am invoking the constructor of class "OneOfMyClasses" 

的事情是,而不是調用構造函數,然後傳遞對象爲運營商<的參數它解釋我試圖記錄一個指向函數的指針。

當然,對於這個問題的一些有效的解決方案包括:

  • 拆除模板操作< <,並使MyLoggingClass延長的std :: ostream的
  • 拆除模板操作< <,並創建噸非會員運營商< <(MyLoggingClass &,const OneOfMyClasses &)
  • 存儲對象以登錄時間變量le,然後做「記錄器< < temporalObject;」 但是,我想知道是否有辦法強制編譯器評估構造函數調用。你知道這種情況下的解決方法嗎?

預先感謝您的寶貴時間:)

+0

難道周圍構造額外的括號來解決?即'記錄器<<(OneOfMyClasses(params));' – 2012-01-12 14:12:24

+0

哦,我忘了提及它。不,它不起作用:S – dunadar 2012-01-12 14:16:22

回答

6

我覺得這是問題是:

template<typename T> MyLoggingClass & operator<<(T& data){ ... } 

data是非const引用和行:

logger << OneOfMyClasses(params); 

正試圖將臨時綁定到非常量引用。

更改爲:

template<typename T> MyLoggingClass & operator<<(const T& data){ ... } 
               //^^^^^ 
+0

@BoPersson,謝謝並編輯。 – hmjd 2012-01-12 14:44:44

+0

你是對的:這是固定的事情。處理「遺留代碼」的問題之一 - 從添加限定符後我必須修復的常量相關錯誤級聯中解脫出來。 – dunadar 2012-01-12 15:05:57