В следующем коде
template <typename T>
void foo(T) {
bar(T{});
}
class Something {};
void bar(Something) {}
int main() {
foo(Something{});
}
(https://wandbox.org/permlink/l2hxdZofLjZUoH4q)
Когда мы вызываем foo()
с параметром Something
, все работает так, как ожидалось, вызов отправляется на пересылку bar(Something)
.
Но когда я изменяю аргумент на целое число и предоставляю перегрузку bar(int)
, я получаю сообщение об ошибке
template <typename T>
void foo(T) {
bar(T{});
}
void bar(int) {}
int main() {
foo(int{});
}
Ошибка:
error: call to function 'bar' that is neither visible in the template definition nor found by argument-dependent lookup
(https://wandbox.org/permlink/GI6wGlJYxGO4svEI)
В случае класса я не определил bar()
в пространстве имен вместе с определением Something
. Это означает, что я не получаю ADL. Тогда почему код работает с типами классов?