簡體   English   中英

使用std類型的ADL找不到運算符

[英]ADL using std types fails to find operator

以下代碼無法編譯

namespace A {
using C = std::vector<std::string>;
std::ostream& operator << (std::ostream& lhs, const C& rhs) {
    lhs << 5;
    return lhs;
}
}
int main()
{
    A::C f;
    std::cout << f;
    return 0;
}

與錯誤

Error   C2679   binary '<<': no operator found which takes a right-hand operand of type 'A::C' (or there is no acceptable conversion)   

顯然,由於將C視為std名稱空間中的類,因此找不到<< <<運算符。 有什么方法可以確保編譯器找到此運算符或以其他方式解決該問題?

A::C只是類型別名,別名是透明的。 他們不會“記住”他們來自哪里。 當我們進行依賴於參數的查找並弄清楚關聯的名稱空間是什么時,我們僅考慮類型的關聯名稱空間-而不是使我們到達那里的別名。 您不能只是將關聯的名稱空間添加到現有類型。 f的特定關聯命名空間(類型為std::vector<std::string> )為std ,沒有與之關聯的operator<< 由於沒有使用普通查詢找到的operator<< ,也沒有使用ADL找到的operator<< ,因此調用失敗。

現在,我說過不能將關聯的名稱空間添加到現有類型中。 但是,您當然可以創建新類型:

namespace A {
    struct C : std::vector<std::string> { };
}

要么:

namespace A {
    // template parameters are also considered for associated namespaces
    struct S : std::string { };
    using C = std::vector<S>;
}

暫無
暫無

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

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