0

エラーテキストとして出力するオプションのストリーム引数を取る必要があるこの関数があります。

void showUsage(std::wstringstream oErrortext, bool bExit, int nExitCode)
{
    if(oErrortext.rdbuf()->in_avail() > 0)
        std::wcerr << oErrortext << std::endl;

    std::wcout << gUsage << std::endl;

    if(bExit == true)
        exit(nExitCode);
}

これを単一の引数で呼び出そうとすると、正常に動作します。

showUsage(std::wstringstream(L"Multiple filenames for target found"), true, 10);

しかし、stringstream を使用したかった理由は、静的な文字列だけでなく、generaetd 文字列を構築できるようにするためです。

例:

showUsage(std::wstringstream(L"Number format for offset missing -") << oParam->mOption, true, 10);

しかし、これでコンパイルエラーが発生します。

  1. この一時オブジェクトを作成し、パラメーターを 1 行でストリーミングするにはどうすればよいですか (または、最初に作成する必要があるので、1 行では不可能です)。
  2. 私がここでやろうとしていることに対するより良い解決策はありますか (可変引数をいじらないでください)?
4

2 に答える 2

2

stringストリームの代わりに aを使用できます。

void showUsage(std::wstring oErrortext, bool bExit, int nExitCode)
{
    if (!oErrortext.empty())
        std::wcerr << oErrortext << std::endl;
    ...
}

それを使用するには、文字列を次のように連結します+

showUsage(std::wstring(L"Number format missing -") + oParam->mOption, true, 10);

operator<<私のシステムはof の戻り値の型に互換性がありません( への参照ではなくstringstreamへの参照を返します) 。、しかし、あなたは確かにこの醜いハックを望んでいません)。したがって、これが実装上のバグでない限り (可能性は低いです!)、上記のようにコードを大幅に変更する必要があります。ostreamstringstreamstringstreamstatic_cast

于 2014-01-14T13:31:21.163 に答える
0

stringstream の参照を使用することをお勧めします。

std::wstringstream& showUsage(std::wstringstream& oErrortext, bool bExit, int nExitCode)

( &に注意してください)

ストリームのコピーが問題のようです。(ソースと宛先で何が起こるかを考えて...)

あなたがしたようにそれを渡すと、文字列のコピーが必要になります。これは、参照渡しで回避できます。

于 2014-01-14T12:17:29.993 に答える