Компиляция следующего кода завершается неудачно, потому что вторая функция не может найти первую, даже если она находится за пределами пространств имен.Я не мог понять проблему сам, и до сих пор я не нашел никаких ответов в сети.
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 {
}
удалено, ошибки не возникает.