Я заметил странное поведение в отношении поиска функций, когда полагался на функцию, которая будет определена позже:
#include <iostream>
template <typename T>
void foo(const T&)
{
std::cout << "Basic" << std::endl;
}
template <typename T>
void bar()
{
T x;
foo(x);
}
void foo(const int& x)
{
std::cout << "int:" << x << std::endl;
}
int main()
{
bar<int>();
}
Выход:
Basic
По какой-то причине я ожидал использования foo внутри bar, чтобы найти перегрузку под ним. Перемещение перегрузки foo выше bar делает вывод желаемым int:0 (или просто написание объявления).
Такое же поведение не применимо к перегрузке бинарного оператора:
#include <iostream>
struct Foo {} foo;
template <typename T>
void operator<<(const Foo&, const T&)
{
std::cout << "Basic" << std::endl;
}
template <typename T>
void bar()
{
T x;
foo << x;
}
void operator<<(const Foo&, const int& x)
{
std::cout << "int:" << x << std::endl;
}
int main()
{
bar<int>();
}
Выход:
int:0
У меня есть два вопроса, первый: почему такое поведение и почему оно отличается от перегрузки оператора? Второй: если у меня есть именованная функция (например, мое использование foo), есть ли способ написать функцию bar таким образом, чтобы обнаруживать перегруженные foo, объявленные позже в единице перевода?
operator <<вводится через ADL, потому чтоFooвводит пространство имен::. - person Travis Gockel   schedule 03.07.2013