[英]How to disambiguate ADL call with candidates in different namespaces?
給定以下類別:
struct foo : public boost::static_visitor<> {
void do_stuff(int item) {}
}
現在,在另一個上下文中,我有一個std::vector<foo>
並想在其上執行以下算法:
using namespace std::tr1;
using namespace std::tr1::placeholders;
std::vector<foo> items;
std::for_each(items.begin(), items.end(), bind(&foo::do_stuff, _1));
這引發了巨大的模板錯誤消息,其歸結為對std::tr1::ref
或boost::ref
的模棱兩可的調用。 如果我從foo
刪除基本類boost::static_visitor
,一切正常。
據我了解,問題是在std::tr1::bind
的代碼深處,在沒有命名空間限定的情況下調用了ref(arg)
。 因為bind
在命名空間std::tr1
,所以std::tr1::ref
在作用域中。 但是,由於foo
繼承自名稱空間boost
,因此ADL還會找到boost::ref
。 這種理解正確嗎?
由於我需要該基類(它是Boost.Variant的一部分),因此我需要知道是否可以通過這種方式消除此調用與我的代碼的歧義?
注意:我在這里停留在C ++ 03上,因此使用了std::tr1
。
Jesse提供了指向該問題的解決方案的答案的鏈接。 但是,在這種情況下,我想出了一個不同的解決方案。 boost::static_visitor
只有一個函數,它提供一個result_type
typedef。 可以輕松地手動添加它,並且不再需要基類。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.