为什么在下一个程序中成员函数foo优先于全局foo,尽管全局foo匹配类型?
#include <iostream>
using namespace std;
void foo(double val) { cout << "double\n";}
class obj {
public:
void callFoo() { foo(6.4); }
private:
void foo(int val) {cout << "class member foo\n"; }
};
int main() {
obj o;
o.callFoo();
}
Run Code Online (Sandbox Code Playgroud) 我会试着解释一下我要做的事情:
bool if_filter_applies() {return true;}
#defile LOGFILE if( if_filter_applies() ) LOG_STREAM_OBJECT
void globalFunc() { LOGFILE << "Some data \n"; }
class C {
int a;
bool if_filter_applies() {
if ( a == 1)
return true;
else
return false;
}
public:
void regMem () {
LOGFILE << "Some data\n";
}
static void staticMem() {
LOGFILE << "Some data\n";
}
};
Run Code Online (Sandbox Code Playgroud)
我正在尝试修改LOGFILE定义,以便它只在基于成员函数的输出从类的成员函数中使用时才写入流if_filter_applies()
.
如果从类外部或静态成员函数中使用LOGFILE,我希望它使用Global if_filter_applies()
函数(总是返回true).
上面的代码没有编译,因为static void staticMem()
最终使用if_filter_applies()
类成员而不是全局.
我不想创建一个类似于#define LOGFILE
静态成员函数替换的不同定义,因为我们的代码中有数百个文件,我不想手动替换所有出现的内容.
那么我可以对#defile LOGFILE
宏进行任何更改,以便它 …
考虑以下代码片段:
enum class Bar {
A
};
void foo(Bar) {}
struct Baz {
void foo() {
foo(Bar::A);
}
};
Run Code Online (Sandbox Code Playgroud)
它无法编译,来自 gcc 9.2 的消息是:
:12:19: error: no matching function for call to 'Baz::foo(Bar)'
12 | foo(Bar::A);
|
Run Code Online (Sandbox Code Playgroud)
我不怀疑这是一个错误,因为 clang 10 也失败了。关于这种情况,我有两个问题:
标准在哪里定义了这种重载的行为?
以这种方式指定编译器行为的可能原因是什么?