【发布时间】:2020-09-02 08:38:43
【问题描述】:
为什么我不能有一个与成员函数同名的非成员函数,如果它也恰好带有指向类的指针?
这不能编译:
struct FooConfig{ int value; };
struct BarConfig{ int value; };
class Api
{
void configure(const FooConfig& cfg);
void configure(const BarConfig& cfg);
};
// helper
static void configure(Api* self, int value)
{
// Actual impl
}
void Api::configure(const FooConfig& cfg)
{
configure(this, cfg.value);
}
void Api::configure(const BarConfig& cfg)
{
configure(this, cfg.value);
}
Gcc 和 Clang 都在骗我,说没有名为 configure 的函数需要 2 个参数。
有趣的部分来了:
如果我只是用 self 指针重命名辅助函数,或者让它使用引用而不是指针,那么它突然就存在了,一切都很好。
AFAIK,与成员函数的巧合相似在名称查找中并不重要。我在愚弄 C++ 吗?
【问题讨论】:
-
::configure(this, cfg.value); -
哇!我希望编译器会告诉我。我会接受这个作为答案。
-
重载适用于在同一范围内定义的函数。
API有两个成员函数名称configure,它们是重载的。全局命名空间中的其他东西没有定义在与其他两个相同的范围内,因此编译器不会查找它。编译器可能会猜到您打算使用全局函数,但是当有六个全局函数时,或者当您不打算使用全局函数并且只是简单地使用全局函数时,您会发现一个非常烦人的警告输入错误的参数之一。
标签: c++ name-lookup