Вложенное имя типа относится к не выводимым контекстам :
1) Спецификатор вложенного имени (все слева от оператора разрешения области: :) типа, указанного с помощью квалифицированного идентификатора:
Так что operator==
не может быть вызвано, потому что не удается вывести аргументы шаблона; Параметр шаблона не может быть выведен.
Вы можете сделать это не шаблонной функцией и определить ее внутри определения класса. например,
template<class T>
class TemplateClass {
...
class Ele {
...
friend bool operator==(const typename TemplateClass<T>::Ele& e1,
const typename TemplateClass<T>::Ele& e2) {
return e1.x == e2.x;
}
};
};
ЖИТЬ
Или сделайте его не шаблонной функцией-членом, тогда вы можете определить их из определения класса. например,
template<class T>
class TemplateClass {
...
class Ele {
...
bool operator==(const typename TemplateClass<T>::Ele& e2) const;
bool operator!=(const typename TemplateClass<T>::Ele& e2) const;
};
};
template<class T>
bool TemplateClass<T>::Ele::operator==(const typename TemplateClass<T>::Ele& e2) const {
return x == e2.x;
}
template<class T>
bool TemplateClass<T>::Ele::operator!=(const typename TemplateClass<T>::Ele& e2) const {
return ! (*this == e2);
}
ЖИТЬ