繁体   English   中英

运算符<重载错误,操作数无效

[英]Error with operator< overload, invalid operands

当我尝试使用这样的代码时:

namespace
{
    typedef boost::shared_ptr< float >  sharedFloat;
}

static bool operator<( const sharedFloat& inOne, float inTwo )
{
    return *inOne < inTwo;
}

static void foo()
{
    std::vector< sharedFloat > theVec;
    std::vector< sharedFloat >::iterator i =
        std::lower_bound( theVec.begin(), theVec.end(), 3.4f );
}

我收到一个错误:

error: invalid operands to binary expression ('boost::shared_ptr<float>' and 'float')

(在lower_bound的实现中使用指向<比较的指针。)那么,当我向operator<提供这些操作数时,为什么它们无效?

如果我改用比较函子,

namespace
{
    typedef boost::shared_ptr< float >  sharedFloat;

    struct Comp
    {
        bool operator()( const sharedFloat& inOne, float inTwo )
        {
            return *inOne < inTwo;
        }
    };
}

static void foo()
{
    std::vector< sharedFloat > theVec;
    std::vector< sharedFloat >::iterator i =
        std::lower_bound( theVec.begin(), theVec.end(), 3.4f, Comp() );
}

然后编译。 我可以那样做,但是我想知道为什么第一次尝试失败了。

解决方案后添加: Herb Sutter的“命名空间和接口原理”为我进一步澄清了这些内容。

lower_bound不会找到您的operator< ,因为它不在与您使用的类型关联的任何命名空间中。

编译器将在名称空间stdboost查找,但不在全局名称空间中查找,因为其中没有涉及任何东西。

当您通过Comp显式性时,它就起作用了,因为这样编译器就不必搜索匹配的运算符。

operator <的调用在std名称空间内执行。 因此,编译器将在std名称空间及其参数(ADL)的名称空间中寻找operator <适当重载。 如果找到一个运算符( 即使它不可行 !),也不会搜索封闭的名称空间。

由于您的operator <是在全局命名空间中定义的,因此编译器将不会考虑它(因为另一个重载operator <存在于std命名空间中,并且在查找名称之前可能会考虑将命名空间包含在内)。

最后,由于std::operator <不可行,因此编译器将发出错误。

当将您自己的函子作为最后一个参数传递时,事情显然有所不同:不是寻找可行的operator < ,而是调用了参数本身,并且一切都可以正常编译。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM