次のようなコードを使用しようとすると:
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 による Namespaces & Interface Principleは、このことをより明確にするのに役立ちました。