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 上,我收到错误:错误 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
    };
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&thenoperator()使用const X& &- 引用来引用,而 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 回答