簡體   English   中英

如何用不同名稱空間中的候選對象消除ADL呼叫的歧義?

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

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