【发布时间】:2020-12-09 10:45:15
【问题描述】:
实际上,下面的代码并不能用 Clang 用这个命令编译:
clang++ -std=c++11 test.cc -o test.
我只是想模仿与 C++ 中的“交换习惯用法”相同的行为,以使用“使用指令”来启用 ADL。但是下面的代码我哪里错了?预期的调用优先级应该是:N1::foo > N2::foo > ::foo,对吧?
namespace N1 {
struct S {};
void foo(S s) {
std::cout << "called N1::foo.";
}
}
namespace N2 {
void foo(N1::S s) {
std::cout << "called N2::foo.";
}
}
void foo(N1::S s) {
std::cout << "called foo.";
}
int main() {
using N2::foo;
foo(N1::S{});
}
错误信息:
test.cc:54:3: error: call to 'foo' is ambiguous
foo(N1::S{});
^~~
test.cc:40:8: note: candidate function
void foo(S s) {
^
test.cc:45:8: note: candidate function
void foo(N1::S s) {
^
1 error generated.
更新:
我将 N2::foo 更改为可以在某种程度上模仿 std::swap 的模板方法。那么,这里的问题是为什么::foo不能被main函数中的“foo(N1::S{});”调用?由于该函数应该比在具有相同优先级时调用的模板函数更合适。
namespace N1 {
struct S {};
/*
void foo(S s) {
std::cout << "called N1::foo, specific one." << '\n';
}
*/
}
namespace N2 { // as a fallback to unqualified name which has no user-defined overload.
template<typename T>
void foo(T) {
std::cout << "called N2::foo, generic one." << '\n';
}
}
void foo(N1::S s) {
std::cout << "called foo." << '\n';
}
int main() {
using N2::foo;
foo(N1::S{});
foo(10); // use generic version.
}
【问题讨论】:
标签: c++ argument-dependent-lookup name-lookup