[英]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.