아래 코드를 참조하십시오. 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;
}
UPDATE 1 : 내가 그러나 나는 그것이 첫 번째 템플릿 매개 변수 드라이브의 인수의 유형을 말 했는가, ADL에 관한 대답은 거의 satified입니다, 그것은이다 차 :
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;
}
: OK, 여기에 우리가 펑과 기능 헤더가 필요하지 않습니다, 더 간단한 코드입니다
자, 왜 컴파일러가 drive
ADL을 찾을 수 없는지 이해합니다. 이유는 위와 같지만이 코드는 템플릿에 의해 가려지지 않습니다.
[명백한 템플릿 인스턴스화 : 이상한 "f가이 범위에서 선언되지 않았습니다."] (http://stackoverflow.com/questions/4775581/explicit-template-instantiation-weird-f-was-not-declared) -in-this-scope) –
ADL은 인수 유형을 추론하는 것이 아니라 이름을 찾는 것입니다. 찰스의 대답은 정확합니다. –
예, 해당 질문을 삭제하려고합니다. 여기에있는 코드가 훨씬 좋습니다. – Ali