Компиляция следующего кода завершается неудачно, потому что вторая функция не может найти первую, даже если она находится вне пространств имен. Сам не мог разобраться в проблеме и пока не нашел ответов в сети.
test.cpp:
#include <bits/stdc++.h>
struct myclass {};
template <typename T, typename U>
std::ostream& operator<< (std::ostream &os, const std::pair<T, U> &p) {
os << "(" << p.first << ", " << p.second << ")";
return os;
}
namespace my {
void operator<< (std::ostream os, myclass m) {
std::cout << std::pair<int, int>(5, 4); // This is line 13.
}
}
int main() {
return 0;
}
Ошибка компилятора (g++ test.cpp -O2 -o test.exe
): test.cpp:13:13: error: no match for 'operator<<' (operand types are 'std::ostream {aka std::basic_ostream<char>}' and 'std::pair<int, int>')
.
И продолжается, дается длинный список предложений относительно того, что могло означать operator<<
.
Наблюдение 1: Если две функции различаются по имени, ошибки не возникает.
Наблюдение 2: Если namespace my {
}
удаляется, ошибки не возникает.
::operator<<(std::cout, std::pair<int, int>(5, 4));
, он должен работать, но это ужасно некрасиво (и не имеет цепочки). Я не буду публиковать это в качестве ответа, если есть способ получше. - person scohe001   schedule 22.02.2019using ::operator<<;
). Что касается того, почему поиск не приводит к обнаружению canidate в глобальном пространстве имен ... - person Rerito   schedule 22.02.2019