2017-02-19 21 views
0

я применил принятый ответ this question в шаблонном классе, как это:Пользовательских станд :: набора компаратора - Нет матча для вызова [...]

template <typename T, typename S> 
struct sizeCompare { 
    bool operator() (const std::set<Node<T, S>>& lhs, const std::set<Node<T, S>>& rhs) const { 
     return lhs.size() < rhs.size() || (lhs.size() == rhs.size() && lhs < rhs); 
    } 
}; 

template <typename T, typename S> 
class Graph { 
    private: 
     std::set<std::set<Node <T, S>>, sizeCompare <T, S>> cliques = {}; 
}; 

Теперь я пытаюсь использовать std::lower_bound в одном из методов этого класса, и для этого я хочу повторно использовать мою структуру sizeCompare. Поэтому я последовал синтаксис найденный в this answer, как это:

// Still in Graph.h 
    std::set<Node <T, S>> getCliqueOfSize(const lli n) { 
     // ... 
     typename std::set<std::set<Node <T, S>>, sizeCompare <T, S>>::const_iterator it = std::lower_bound(cliques.begin(), cliques.end(), n, sizeCompare<T, S>()); 
     // ... 
    } 

Однако компиляции это дает следующее сообщение об ошибке:

C:/PROGRA~2/CODEBL~1/mingw64/lib/gcc/x86_64-w64-mingw32/6.2.0/include/c++/bits/predefined_ops.h:144:11: 
error: no match for call to 
(sizeCompare<long long, void*>) (const std::set<Node<long long, void*>, std::less<Node<long long, void*> >, std::allocator<Node<long long, void*> > >&, const long long&) 

    { return bool(_M_comp(*__it, __val)); } 
      ^~~~~~~~~~~~~~~~~~~~~~~~~~~ 

стек ошибки указывает, что эта ошибка происходит при создании способа, показанного выше , Единственный раз, когда я создаю экземпляр класса Graph, я использую <long long, void *>, так что из него появляются типы, показанные в ошибке компиляции. Может ли кто-нибудь объяснить, почему я получаю эту ошибку, и, возможно, как ее исправить?

ответ

2

У вас есть компаратор для двух наборов, но вы вызываете std::lower_bound() на набор со значением key_type. То есть вы ищете ключ в наборе. Но ваш компаратор не поддерживает set < long long int, только set < set.

Может быть, вам нужно определить дополнительный компаратор:

bool operator() (const std::set<Node<T, S>>& lhs, const T& rhs) const; 
+0

Спасибо. Это и решило. – pie3636