gpt4 book ai didi

c++ - 如何用不同 namespace 中的候选人消除 ADL 调用的歧义?

转载 作者:太空宇宙 更新时间:2023-11-04 13:55:50 25 4
gpt4 key购买 nike

给定以下类:

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 .如果我删除基类 boost::static_visitor来自 foo一切正常。

据我了解,问题在于 std::tr1::bind 的代码深处, 一个 ref(arg)在没有 namespace 限定的情况下被调用。因为bind在命名空间 std::tr1 中, std::tr1::ref在范围内。但是,因为 foo继承自命名空间 boost 中的类, ADL 还发现 boost::ref .这样理解对吗?

因为我需要那个基类(它是 Boost.Variant 的一部分),我需要知道这里是否有任何方法可以从我的代码中消除这个调用的歧义?

注意:我在这里坚持使用 C++03,因此使用了 std::tr1 .

最佳答案

Jesse 提供了一个链接,指向一个解决这个问题的答案。但是,在这种特殊情况下,我想出了一个不同的解决方案。 boost::static_visitor 只有一个功能,它提供了一个result_type typedef。这可以很容易地手动添加,并且不再需要基类。

关于c++ - 如何用不同 namespace 中的候选人消除 ADL 调用的歧义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21505315/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com