3

これが私のコードです:

using namespace std;

class Pixel
{
public:
    bool AreSamplesIdentical() const
    {
        return true;
    }
};

namespace
{
class Predicate_SamplesEqual : public unary_function<const Pixel&, bool>
{
public:
    bool operator () (const Pixel& pixel) const
    {
        return pixel.AreSamplesIdentical();
    }
};
}

int main()
{
    vector<Pixel> pixels(10);
    find_if(pixels.begin(), pixels.end(), not1(Predicate_SamplesEqual()));
}

Visual Studio 2008 C++ Express でエラーが発生しました: error C2529: '_Left' : reference to reference is illegal From inside library code.

しかし、私はここで試してみましたが、コンパイルされます: http://ideone.com/swWrZT

ここで誰が間違っていますか?私の場合、どうすれば回避策を​​コーディングできますか?

エラーは、機能から示された行で発生します

    // TEMPLATE CLASS unary_negate
template<class _Fn1>
    class unary_negate
    : public unary_function<typename _Fn1::argument_type, bool>
    {   // functor adapter !_Func(left)
public:
    explicit unary_negate(const _Fn1& _Func)
        : _Functor(_Func)
        {   // construct from functor
        }

    /**error**/bool operator()(const typename _Fn1::argument_type& _Left) const
        {   // apply functor to operand
        return (!_Functor(_Left));
        }

protected:
    _Fn1 _Functor;  // the functor to apply
    };
4

2 に答える 2

4

unary_functionエラーは、最初のテンプレート引数を型として使用し、参照を作成するためだと思います:

template<typename Arg, typename Result>
struct unary_function
{
    typedef Arg argument_type;
    typedef Result result_type;
    ...
    virtual result_type operator()(const argument_type& _Left) const = 0;
    ...
}

そのため、 if Argis const X&then operator()uses const X& &- reference to reference であり、vc 9.0 はそれを処理できません。

明らかな修正は、次のように書くことです。

class Predicate_SamplesEqual : public unary_function<Pixel, bool>
...
于 2013-03-25T17:06:10.187 に答える
1

ここで誰が間違っていますか?

MSVC も GCC も、デフォルト オプションで実行した場合に標準に準拠しているとは主張していないため、どちらも正確に「間違っている」わけではありません。

この場合、GCC 4.7 は C++11 の参照折りたたみルールを適用します (これは、C++11 モードがなくても GNU 拡張です)。

GCC を以前の標準に準拠させたい場合は、コマンドライン オプション--std=c++98を渡すと、コードが拒否されます。

于 2013-03-25T17:02:14.433 に答える