[英]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<
,因为它不在与您使用的类型关联的任何命名空间中。
编译器将在名称空间std
和boost
查找,但不在全局名称空间中查找,因为其中没有涉及任何东西。
当您通过Comp
显式性时,它就起作用了,因为这样编译器就不必搜索匹配的运算符。
对operator <
的调用在std
名称空间内执行。 因此,编译器将在std
名称空间及其参数(ADL)的名称空间中寻找operator <
适当重载。 如果找到一个运算符( 即使它不可行 !),也不会搜索封闭的名称空间。
由于您的operator <
是在全局命名空间中定义的,因此编译器将不会考虑它(因为另一个重载operator <
存在于std
命名空间中,并且在查找名称之前可能会考虑将命名空间包含在内)。
最后,由于std::operator <
不可行,因此编译器将发出错误。
当将您自己的函子作为最后一个参数传递时,事情显然有所不同:不是寻找可行的operator <
,而是调用了参数本身,并且一切都可以正常编译。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.