【发布时间】:2011-06-14 04:53:55
【问题描述】:
请参阅下面的代码。 drive()在范围内,我可以driveporsche。但是,除非我取消注释 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 的答案几乎满意,但是我确实告诉了驱动参数的类型,它是第一个模板参数,它是汽车:
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;
}
现在,我明白了为什么编译器无法使用 ADL 找到 drive。原因同上,只是这段代码没有被模板遮挡。
【问题讨论】:
-
ADL 不是关于推断参数类型,而是关于查找名称。查尔斯的回答似乎是正确的。
-
是的,我即将删除该问题。这里的代码好多了。
-
@Fred Nurk:我没有说查尔斯的回答是错误的,我只是不明白。 :"(
标签: c++ scope visibility friend functor