Почему этот оператор <функция перегрузки невидим для алгоритмов STL? - PullRequest
3 голосов
/ 26 февраля 2020

Я научился перегружать operator<, чтобы сделать пользовательские классы совместимыми с алгоритмами STL, вот так:

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()));

Однако, когда я пытаюсь сделать то же самое с Объект ValueTree из библиотеки JUCE не работает:

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 поэтому выкинул бы исключение. Прямо сейчас я просто пытаюсь получить код для компиляции и держу пример кратким.

1 Ответ

7 голосов
/ 26 февраля 2020

Чтобы найти ADL, вы должны поместить своего оператора в то же пространство имен, что и класс:

namespace juce
{
    bool operator< (const ValueTree& lhs, const ValueTree& rhs) { /*..*/ }
}
...