2013-04-28 64 views
1

我想實現這個字符串流創建日誌宏:在擴展

#include <iostream> 
#include <sstream> 

void log(
     const char* argFile, 
       int argLineNb, 
       const char* argFunction, 
       std::stringstream& argString) { 
    std::cout << argFile << ":" << argLineNb << " " << argFunction 
     << " " << argString.str()<< std::endl; 
} 


/** 
* \brief  Macro declarations 
*/ 

#define LOG_TEST(f) \ 
       log(__FILE__, __LINE__, \ 
         __FUNCTION__, (std::ostringstream << f)) 

int main(int argc, char** argv) { 

    LOG_TEST("HELLO"); 
    LOG_TEST("HELLO" << " !"); 

    return 0; 
} 

問題是,我真的不知道該怎麼做,因爲我得到了以下錯誤:

類型的參考無效初始化 '的std :: stringstream的& {又名的std :: basic_stringstream &}' 從類型的std :: basic_ostream的」表達:: __ ostream_type {又名的std :: basic_ostream

我不知道是否有這樣做與升壓...

這裏是源更簡單的方法:http://coliru.stacked-crooked.com/view?id=222cbb23ea5162b16378b13a24fceb9e-4f0e144d2529f0880899ab58231ebbe3

+0

你傳遞一個tempval'stringstream'的功能要求**非const **參考。除少數編譯器之外,所有這些都不會讓你這麼做,因爲它是非標準的。最爲人熟知的是微軟。幾乎其他人都不會。 – WhozCraig 2013-04-28 00:58:13

+0

@tacp如果你要從OP的鏈接粘貼代碼,至少要粘貼* verbatim *。您發佈的代碼與問題中提供的鏈接上的代碼不同。他的代碼在日誌宏中有一個'std :: stringstream()',你粘貼的代碼有'std :: ostringstream'(注意缺少自動構造)。 – WhozCraig 2013-04-28 01:01:16

+0

@WhozCraig我沒有粘貼它,我只是在OP的問題中改變了代碼的格式。問題是什麼?我甚至沒有看過鏈接。 – taocp 2013-04-28 01:03:27

回答

2

這裏的主要問題是:(std::stringstream() << f)

如果你讀了參考std::stringstreamoperator<<(...)你會發現它是從std::ostream

http://www.cplusplus.com/reference/ostream/ostream/operator%3C%3C/

繼承10

問題是operator<<(...)返回一個std::ostream,因此,當你通過(std::stringstream() << f)你實際上是傳遞一個std::ostream到需要的std::stringstream(因此,從ostream的字符串流的無效初始化)的函數

達到你想要什麼確切地說,你必須修改你的宏的工作方式。嘗試這樣的事情,而不是:

#define LOG_TEST(f) \ 
    do { std::stringstream s; \ 
     s << f; \ 
     log(__FILE__, __LINE__, __FUNCTION__, s); \ 
    } while (0) 
+0

工程史詩般的感謝! – Syffys 2013-04-28 10:04:09