懶惰的評價我有記錄的一類,一定不能繼承的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;」 但是,我想知道是否有辦法強制編譯器評估構造函數調用。你知道這種情況下的解決方法嗎?
預先感謝您的寶貴時間:)
難道周圍構造額外的括號來解決?即'記錄器<<(OneOfMyClasses(params));' – 2012-01-12 14:12:24
哦,我忘了提及它。不,它不起作用:S – dunadar 2012-01-12 14:16:22