[英]How can this code cause ambiguity between NS1::format and NS3::format?
是否由於使用導入的Object類而導入了格式? 但是按照相同的邏輯,如果一個類使用導入的Object類,則不會導入該類。
namespace NS1 {
class Object { /* ... */ };
int format(const Object&) { std::cout << "NS1"; }
namespace NS2 {
class Object { /* ... */ };
int format(const Object&) { std::cout << "NS2"; }
}
}
namespace NS3 {
using NS1::Object;
int format(const Object&) { std::cout << "NS3"; }
}
namespace { using namespace NS3; }
void fun(Object b, int i) { int i1 = format(b); }
int main() {
Object b;
fun(b, 0);
}
讓我們看一下GCC產生的錯誤消息:
test.cpp: In function ‘void fun(NS1::Object, int)’:
test.cpp:19:48: error: call of overloaded ‘format(NS1::Object&)’ is ambiguous
void fun(Object b, int i) { int i1 = format(b); }
^
test.cpp:19:48: note: candidates are:
test.cpp:14:5: note: int NS3::format(const NS1::Object&)
int format(const Object&) { std::cout << "NS3"; }
^
test.cpp:5:5: note: int NS1::format(const NS1::Object&)
int format(const Object&) { std::cout << "NS1"; }
^
依賴於參數的查找(也稱為ADL或Koenig查找)是用於在函數調用表達式中查找不合格函數名稱的規則集,包括對重載運算符的隱式函數調用。 除了通常的非限定名稱查找所考慮的范圍和名稱空間之外,還在其參數的名稱空間中查找這些函數名稱。
在您的情況下,您嘗試調用format(b)
,其中b
是NS1::Object
。
int NS3::format(const NS1::Object&)
是因為您拉入了該命名空間。 int NS1::format(const NS1::Object&)
:參數來自名稱空間NS1
,因此也將考慮來自NS1
的匹配函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.