1

C++11 の可変個引数テンプレート機能を使用して、関数のすべての引数を出力したいと考えています。そして、私は次のことをしました:

struct concatenate
{

    template< typename ...ARGS >
    explicit
    concatenate(ARGS const & ...args)
    {
        cat(args...);
    }

    /*explicit*/
    operator std::string const () const
    {
        return oss.str();
    }

private :

    std::ostringstream oss;

    void cat() const
    { ; }

    template< typename T, typename ...ARGS >
    void cat(T const & head, ARGS const & ...tail)
    {
        if (oss.tellp() > 0) {
            oss << ' ';
        }
        oss << head;
        cat(tail...);
    }

};

それから私はそれをテストしようとします:

std::cout << '\'' << concatenate(1, 2, 3, 4, std::string("ololo"), "alala", 'o', 1.2, 1.2L, 1.2f) << '\'' << std::endl;

しかし、コードがエラーでコンパイルされない場合:

error: cannot bind 'std::basic_ostream<char>' lvalue to 'std::basic_ostream<char>&&' c:\mingw\lib\gcc\mingw32\4.7.0\include\c++\ostream:600: error: initializing argument 1 of 'std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&) [with _CharT = char; _Traits = std::char_traits<char>; _Tp = concatenate]'

エラーの性質は何ですか? 結局、コンパイラは変換演算子を使用するしかありません。そうじゃない?

4

2 に答える 2

3

operator << for class template std::basic_string は (無料の) function templateとして定義されています。テンプレート以外の関数とは対照的に、テンプレートの引数推定には可能な引数の変換は含まれません。テンプレート化された演算子 << for basic_string は、正しい引数と暗黙的な変換 (連結から文字列へ) が機能しないため、正確に文字列を必要とします。

于 2012-11-29T16:06:38.683 に答える
1

明示的な変換演算子を使用しておらずoperator<<、クラスをオーバーロードしていないため、次の呼び出しを試みます。

template <class charT, class traits, class T>
basic_ostream<charT, traits>&
operator<<(basic_ostream<charT, traits>&& os, const T& x);

明示的な変換の使用

std::string(concatenate(1, 2, 3, 4, std::string("ololo"), "alala", 'o', 1.2, 1.2L, 1.2f))

正しいことをします。

于 2012-11-29T15:53:28.860 に答える