Я ожидал, что этот код будет работать, но он не скомпилируется с GCC. Он компилируется, если вы поднимаете внутренний класс.C++ STL не находит компаратор для вложенного класса
#include <algorithm>
template <typename T>
struct Outer
{
struct Inner
{
int x;
};
Inner vec[3];
};
template <typename T>
bool operator <(const typename Outer<T>::Inner& lhs, const typename Outer<T>::Inner& rhs)
{
return lhs.x < rhs.x;
}
int main()
{
Outer<int> out;
Outer<int>::Inner in;
std::lower_bound(out.vec, out.vec + 3, in);
}
GCC 4.4 это сказать:
...
bits/stl_algo.h:2442: error: no match for ‘operator<’ in ‘* __middle < __val’
GCC 4.7 печатает намного больше вещей, в том числе выше, заканчивающийся с этим:
...
bits/stl_algobase.h:957:4: note: couldn't deduce template parameter ‘T’
Я готов поверить это не хорошо сформированный C++, но почему бы и нет?
Мне нравится ваш ответ, даже если мне не нравится, что это означает для C++. Спасибо, что нашли время - вы наверняка заработали щедрость! –