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::basic_ostream::__ostream_type {別名 std::basic_ostream の式からの型 'std::stringstream& {aka std::basic_stringstream&}' の参照の無効な初期化

ブーストでそれを行う簡単な方法があるかどうかはわかりません...

ソースは次のとおりです

4

1 に答える 1

2

ここでの主な問題は次のとおりです。(std::stringstream() << f)

std::stringstreamへの参照を読むと、operator<<(...)それがから継承されていることがわかりますstd::ostream

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

問題は、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)
于 2013-04-28T01:16:29.147 に答える