为什么这个 operator< 重载函数对 STL 算法不可见?
Why is this operator< overload function invisible to STL algorithms?
为了使自定义类与STL算法兼容,我学会了重载operator<
,就像这样:
struct A
{ int a; };
bool operator< (const A& x, const A& y)
{ return x.a < y.a; }
std::vector<A> aOne, aTwo, aResult;
std::set_difference(aOne.begin(), aOne.end(),
aTwo.begin(), aTwo.end(),
std::inserter(aResult, aResult.begin()));
然而,当我尝试用 JUCE 库中的 ValueTree 对象做同样的事情时,它失败了:
bool operator< (const juce::ValueTree& x, const juce::ValueTree& y)
{
// let's now worry about the implementation of this function here...
return true;
}
std::vector<juce::ValueTree> vOne, vTwo, vResult;
std::set_difference(vOne.begin(), vOne.end(),
vTwo.begin(), vTwo.end(),
std::inserter(vResult, vResult.begin()));
// COMPILER ERROR: Failed to specialize function template 'unknown-type std::less<void>::operator ()(_Ty1 &&,_Ty2 &&) const'
谁能看出我的 operator<
函数有什么问题?
我知道答案可能与 ValueTree
的内部工作有关,因此这是一个不完美的问题。但是我不知道 类型的 事情可能会在这里出错。在我看来,这两个案例似乎完全对称,所以我不知道为什么一个失败而另一个成功。
请注意:我知道我没有对数组进行排序,因此 set_difference
会引发异常。现在我只是想编译代码,并保持示例简短。
要被 ADL 找到,您必须将运算符放在与 class:
相同的名称空间中
namespace juce
{
bool operator< (const ValueTree& lhs, const ValueTree& rhs) { /*..*/ }
}
为了使自定义类与STL算法兼容,我学会了重载operator<
,就像这样:
struct A
{ int a; };
bool operator< (const A& x, const A& y)
{ return x.a < y.a; }
std::vector<A> aOne, aTwo, aResult;
std::set_difference(aOne.begin(), aOne.end(),
aTwo.begin(), aTwo.end(),
std::inserter(aResult, aResult.begin()));
然而,当我尝试用 JUCE 库中的 ValueTree 对象做同样的事情时,它失败了:
bool operator< (const juce::ValueTree& x, const juce::ValueTree& y)
{
// let's now worry about the implementation of this function here...
return true;
}
std::vector<juce::ValueTree> vOne, vTwo, vResult;
std::set_difference(vOne.begin(), vOne.end(),
vTwo.begin(), vTwo.end(),
std::inserter(vResult, vResult.begin()));
// COMPILER ERROR: Failed to specialize function template 'unknown-type std::less<void>::operator ()(_Ty1 &&,_Ty2 &&) const'
谁能看出我的 operator<
函数有什么问题?
我知道答案可能与 ValueTree
的内部工作有关,因此这是一个不完美的问题。但是我不知道 类型的 事情可能会在这里出错。在我看来,这两个案例似乎完全对称,所以我不知道为什么一个失败而另一个成功。
请注意:我知道我没有对数组进行排序,因此 set_difference
会引发异常。现在我只是想编译代码,并保持示例简短。
要被 ADL 找到,您必须将运算符放在与 class:
相同的名称空间中namespace juce
{
bool operator< (const ValueTree& lhs, const ValueTree& rhs) { /*..*/ }
}