Это проблема, с которой CGW 1835 имеет дело, цитируя ее здесь:
Согласно пункту 6.4.5 [basic.lookup.classref]
В выражении доступа к члену класса (8.2.5 [expr.ref]), если.или -> за маркером сразу же следует идентификатор, за которым следует <, идентификатор необходимо найти, чтобы определить, является ли <начало списка аргументов шаблона (17.2 [temp.names]) или оператор меньше чем.Идентификатор сначала ищется в классе выражения объекта.Если идентификатор не найден, он затем просматривается в контексте всего выражения postfix и должен называть шаблон класса. </p>
template<typename T> T end(T);
template<typename T>
bool Foo(T it) {
return it->end < it->end;
}
, поскольку он является зависимым и, следовательно, конец не может быть просмотренвверх в классе выражения объекта, это ищется в контексте выражения postfix.Этот поиск находит шаблон функции, делая выражение неправильно сформированным.
Одной из возможностей может быть ограничение поиска классом выражения объекта, когда выражение объекта является зависимым.
#include <type_traits>
using namespace std;
template<typename T>
bool comp_rank(const T &a, const T &b){
return a.rank < b.rank; // fail
}
Ошибка обнаруживается даже без создания экземпляра шаблона функции, все выражение является зависимым, поэтому их нельзя найти в области видимости класса.Поскольку текущая формулировка стандарта не ясна, если поиск для rank
в области видимости класса будет отложен для зависимых имен или должен быть связан с именами в контексте выражения postfix , это то, что CGWпопробуйте заняться.
прямое решение - использовать паренс:
template<typename T>
bool comp_rank(const T &a, const T &b){
return (a.rank) < (b.rank);
}