0

私は明らかにクラス定義に友達がいて、より明確にするために、実装コードなどを削除しました...

class Ref
{
    public:
        Ref(char* s, size_t l) : _s(s), _l(l) {}
    private:
        char* _s;
        size_t _l;
};

class foo
{
    public:
        friend stringstream& operator>>(std::stringstream& s, uint8_t& v) { return s; }
        friend stringstream& operator>>(std::stringstream& s, const Ref& r) { return s; }
    private:
        std::stringstream ss;
        void example(void)
        {
            char b[256];
            Ref r(b, sizeof(b));
            uint8_t i;

            ss >> i >> r;    <------ Why do I get an error here?
            ss >> r >> i;    <------ But this one seems to compile fine.
        }
};
4

2 に答える 2

5

なぜオーバーロードしているのstd::stringstreamですか?std::istreamorを常にオーバーロードする必要がありますstd::ostream (方向によって異なります)。std::stringstream使用されることさえ非常にまれで あり(std::istringstreamまたは std::ostringstream通常はより適切です)、使用されたとしても、通常はではなく をoperator>>返します。std::istream&std::stringstream&

編集:

機能しているように見える理由に関して:

ss >> r >> i;

operator>>( operator>>( ss, r ), i );

andoperator>>を取るan を定義したので、内部呼び出しは有効です。そして、あなた はisAを返すので、関数を呼び出すことができます。一方:stringstream&Ref const&operator>>stringstream& std::istreamoperator>>( std::istream&, unsigned char )

ss >> i >> r;

operator>>( operator>>( ss, i ), r );

内部呼び出しは を返し、オーバーロードされたforstd::istream&はありません。operator>>std::istream&, Ref const&

上で述べたように、overloaded>>常にstd::istream&最初の引数として 取り 、 を返す必要がありstd::istream&ます。

于 2013-09-30T14:07:57.710 に答える
1
ss >> i >> r;   <-------  why do I get an error here?

エラーの内容を教えていただくか、エラーの原因となった実際のコードを投稿するのを忘れていました。投稿されたコードの明らかなエラーを修正すると、次のようになります。

cannot bind ‘std::basic_istream<char>’ lvalue to ‘std::basic_istream<char>&&’

最初の問題はss >> i、オーバーロードを呼び出さないことです。のような組み込み型のストリーミング演算子をオーバーロードすることはできませんuint8_t。したがって、これは、標準ライブラリによって定義されたオーバーロードを呼び出します。これは、istreamではなくへの参照を返しますstringstream。演算子は への参照を想定しているstringstreamため、2 番目の演算子は失敗します。

慣例に従い、ostream特定のものではなく一般的なものを使用する必要がありstringstreamます。

friend std::istream& operator>>(std::istream& s, const Ref& r) { return s; }

実際にオペレーターに何か有用なことをさせたい場合はconst、2 番目の引数から を削除する必要があります。

于 2013-09-30T14:16:22.070 に答える