簡體   English   中英

此代碼如何引起NS1 :: format和NS3 :: format之間的歧義?

[英]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) ,其中bNS1::Object

  • 之所以考慮使用函數int NS3::format(const NS1::Object&)是因為您拉入了該命名空間。
  • 由於ADL而考慮使用函數int NS1::format(const NS1::Object&) :參數來自名稱空間NS1 ,因此也將考慮來自NS1的匹配函數。
  • 這兩個函數具有完全相同的簽名,因此不明確。

值得一讀什么是“依賴於參數的查詢”(又名ADL或“ Koenig查找”)? 也一樣

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM