3

次のマクロがあります。

#define STRING_STREAM( data )       \
    ( ( (std::ostringstream&)       \
        ( std::ostringstream( ).seekp( 0, std::ios_base::cur ) << data ) ).str( ) )

列挙型の<<をオーバーロードしようとしています:

std::ostringstream& operator<<( std::ostringstream& oStrStream, TestEnum& testEnum )
{
    oStrStream << "TestEnum";
    return oStrStream;
}

STRING_STREAM(testEnum)を呼び出すと、オーバーロードされた<<を使用しません。列挙型の数値を出力します。

4

2 に答える 2

2
std::ostream& operator<<( std::ostream& oStrStream, const TestEnum testEnum )
{
    oStrStream << "TestEnum";
    return oStrStream;
}
于 2012-05-20T04:55:07.393 に答える
0

問題は、オーバーロードされた<<演算子が。の引数を期待していることです。

new ostringstream() 

しかし、あなたはそれに議論を与えています。

ostringstream()

これは、オーバーロードされた関数と一致していません。

私の例では、auto_ptrを使用して、スコープ外になった後、ostringstreamの割り当てを自動的に解除しました。これにより、マクロを使用して、メモリリークなしで機能を実行できます。

#include<sstream>
#include<iostream>
#define STRING_STREAM( data )                                                  \
   ((ostringstream&)( *( auto_ptr<ostringstream>(new ostringstream()) ) << data)).str()

using namespace std;

enum TestEnum { ALPHA, BETA };

ostringstream& operator<<( ostringstream& oss, TestEnum testEnum ){
    oss << "TestEnum";
    return oss;
}
int main(){
    cout << STRING_STREAM( ALPHA ) << endl;
}
于 2012-05-19T05:08:50.433 に答える