См. Код ниже.drive()
входит в объем , я могу drive
porsche
.Однако, если я не раскомментирую объявление drive()
, g ++ выдаст очень странный 'диск', который не был объявлен в этой области видимости ошибки при попытке создать функтор.Почему?
#include <functional>
class car {
friend void drive(const car c);
};
//void drive(const car c);
int main() {
car porsche;
drive(porsche);
std::pointer_to_unary_function<car, void> functor(drive);
return 0;
}
ОБНОВЛЕНИЕ 1: Я почти удовлетворен ответом относительно ADL, однако я действительно сказал тип аргумента привода, это первый параметр шаблона, этоis car:
std::pointer_to_unary_function<car, void> functor(drive);
ОБНОВЛЕНИЕ 2: Хорошо, вот еще более простой код, нам не нужен функтор и функциональный заголовок:
class car {
friend void drive(const car c);
};
//void drive(const car c) { }
int main() {
car porsche;
drive(porsche);
void (*f)(const car);
f = drive;
return 0;
}
Теперь я понимаю, почему компилятор не может найти drive
с ADL.Причина та же, что и выше, но этот код не скрыт шаблоном.