В следующем сценарии функция operator<<
участвует в разрешении перегрузки (когда она находится в глобальном пространстве имен):
template <typename T>
std::ostream &operator<<(std::ostream &os, const std::vector<T> &vec) {
os << '[';
for (const T &val : vec)
os << val << ", ";
return os << "\b\b]";
}
... но ниже, когда он определен внутри пространства имен, это не так:
namespace blah {
template <typename T>
std::ostream &operator<<(std::ostream &os, const std::vector<T> &vec) {
os << '[';
for (const T &val : vec)
os << val << ", ";
return os << "\b\b]";
}
}
При вызове из main
, как таковой:
int main() {
std::vector<int> vec{5, 4, 3, 6, 4, 3, 5, 6, 8, 1};
std::cout << vec << std::endl;
return 0;
}
... компилятор не может найти перегрузку operator<<
, когда она определена в blah
.
Что происходит?
Редактировать:
При вызове перегрузки с оператором разрешения области видимости все компилируется нормально:
blah::operator<<(std::cout, vec);
Почему это?
Действительно, но тогда я не понимаю, почему перегрузка оператора, такая как <<
, определенная для пользовательских классов, может оставаться в пространстве имен, в котором определены классы, и все еще быть найденными во время поиска?
В первом случае используется поиск по неполному имени и/или поиск ADL (поиск, зависящий от аргумента), который включает глобальное пространство имен, в котором объявлен оператор.
Во втором случае оператор не будет найден, потому что пространство имен blah
не учитывается при поиске неполного имени.
Либо вы можете использовать квалифицированное имя, например:
blah::operator <<( std::cout, vec ) << std::endl;
Или вы можете использовать директиву using
, чтобы включить пространство имен blah
в набор пространств имен для поиска неквалифицированного имени, например:
using namespace blah;
std::cout << vec << std::endl;
@GregorHartlWatters Вовсе нет. Мы, новички, должны помогать друг другу. :)
Действительно, хотя вы точно не кажетесь новичком! :)
@GregorHartlWatters В России мне никто не предлагает работу, потому что все думают, что я слишком мало знаю.
Что ж, похоже, ты знаешь довольно много, так что я уверен, что в конце концов ты найдешь работу!
Как можно найти оператор, объявленный в пространстве имен пользователя, без его уточнения?