У меня проблема с оператором сравнения на основе шаблонов для сравнения экземпляров типа, зависящего от аргумента шаблона. Я некоторое время обыскивал трубки, в том числе SO, и изо всех сил пытался понять, что я делаю неправильно. Я считаю, что это проблема с поиском зависимых имен, но это не помогает мне заставить работать код: - (
Вот минимальный тестовый пример:
template<typename T>
struct Foo
{
struct Bar {
T t;
};
Bar b;
};
template<typename T>
inline bool operator<(const typename Foo<T>::Bar& b1, const typename Foo<T>::Bar& b2)
{ return b1.t < b2.t; }
int main()
{
Foo<int> f1, f2;
return (f1.b < f2.b? 0 : 1);
}
Компиляция дает:
templated-comparison-op.cpp: In function ‘int main()’:
templated-comparison-op.cpp:20:20: error: no match for ‘operator<’ in ‘f1.Foo<int>::b < f2.Foo<int>::b’
templated-comparison-op.cpp:20:20: note: candidate is:
templated-comparison-op.cpp:13:13: note: template<class T> bool operator<(const typename Foo<T>::Bar&, const typename Foo<T>::Bar&)
Пока у меня есть оператор сравнения в качестве члена класса шаблона, который работает нормально, поэтому без срочности. Я хотел бы понять, чего мне здесь не хватает; кто-нибудь может просветить меня?
Редактировать: Это не совсем точный тестовый пример; в реальном коде, из которого я извлек этот случай, шаблонный класс Foo вложен в другой класс, и поэтому необходимы ключевые слова 'typename'. Как указано в ответах ниже, в приведенном выше коде «typename» не понадобится.
Редактировать: Я заменил исходный тестовый сценарий новым, выделяющим текущую проблему, а также обновил заголовок вопроса, так как я пытаюсь воспроизвести точную ошибку, которую я получаю в реальной базе кода , Если есть обходной путь для проблемы в тестовом примере, то, возможно, это приблизит эквивалент в реальном коде к компиляции, поэтому все еще заинтересован в этом.