当unary_function使用引用参数时,使用std :: not1编译时出错

时间:2013-03-25 16:46:02

标签: c++

这是我的代码:

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上,出现错误: 错误C2529:'_ Left':对引用的引用是非法的 从库内代码开始。

但我在这里尝试并编译: 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
    };

2 个答案:

答案 0 :(得分: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;
    ...
}

因此,如果Argconst X&,则operator()使用const X& & - 引用引用,而vc 9.0无法处理它。

明显的解决方法是写:

class Predicate_SamplesEqual : public unary_function<Pixel, bool>
...

答案 1 :(得分:1)

  

这里有谁错?

当使用默认选项运行时,MSVC和GCC都声称不符合任何标准,因此两者都不是“错误”。

在这种情况下,GCC 4.7应用了C ++ 11引用 - 折叠规则(即使没有C ++ 11模式,它也是GNU扩展)。

如果您希望GCC符合以前的标准,请通过命令行选项--std=c++98,它将拒绝您的代码。