为什么这种ADL解决方案歧义
Why is this ADL resolution ambigous
我正在尝试使用C ASIO库的自定义分配器功能(http://think-ashync.com/asio/asio/asio/asio/asio-1.10.6/doc/asio/asio/asio/overview/core/core/core/core/Allocation.html)。我的功能代码全部都在命名空间bb
中,自定义分配函数void* asio_handler_allocate(std::size_t size, ...)
也是如此。我希望ADL选择我的自定义版本,但由于某种原因,它会导致歧义:
c:mysrvasiodetailhandler_alloc_helpers.hpp(38): error C2668: 'bb::asio_handler_allocate': ambiguous call to overloaded function
1> c:mysrvconnection.hpp(16): note: could be 'void *bb::asio_handler_allocate(std::size_t,...)' [found using argument-dependent lookup]
1> c:mysrvasioimplhandler_alloc_hook.ipp(27): note: or 'void *asio::asio_handler_allocate(std::size_t,...)'
1> c:mysrvasiodetailhandler_alloc_helpers.hpp(38): note: while trying to match the argument list '(std::size_t, bb::Server::do_accept::<lambda_18e060fa7342c1167c1b66e6dfdfd1b2> *)'
关于为什么第二个也匹配和/或如何正确使用此功能的任何解释都将不胜感激
谢谢
P.S。我正在添加Boost-Asio标签,因为它假定为同一库,但仅在不同的名称空间中。我实际上在这里使用独立的C 11版本http://think-async.com/
这是一个简化的示例:
#include "asio.hpp"
#include <memory>
#include <iostream>
namespace bb {
void* asio_handler_allocate(std::size_t size, ...) {
std::cerr << 'H' << ' ' << /**h <<*/ ' ' << size << 'n';
return asio::asio_handler_allocate(size);
}
class Connection
: public std::enable_shared_from_this<Connection>
{
public:
Connection(asio::ip::tcp::socket socket)
: socket_(std::move(socket))
{
}
void start()
{
do_read();
}
private:
void do_read()
{
auto self(shared_from_this());
socket_.async_read_some(asio::buffer(data_),
[this, self](std::error_code ec, std::size_t length)
{
if (!ec)
{
do_write(length);
}
});
}
void do_write(std::size_t length)
{
auto self(shared_from_this());
asio::async_write(socket_, asio::buffer(data_, length),
[this, self](std::error_code ec, std::size_t /*length*/)
{
if (!ec)
{
do_read();
}
});
}
asio::ip::tcp::socket socket_;
std::array<char, 1024> data_;
};
class Server
{
public:
Server(asio::io_service& io_service, short port)
: acceptor_(io_service, asio::ip::tcp::endpoint(asio::ip::tcp::v4(), port)),
socket_(io_service)
{
do_accept();
}
private:
void do_accept()
{
acceptor_.async_accept(socket_,
[this](std::error_code ec)
{
if (!ec)
{
std::make_shared<Connection>(std::move(socket_))->start();
}
do_accept();
});
}
asio::ip::tcp::acceptor acceptor_;
asio::ip::tcp::socket socket_;
};
}
int main(int argc, char* argv[])
{
try
{
if (argc != 2)
{
std::cerr << "Usage: server <port>n";
return 1;
}
asio::io_service io_service;
bb::Server s(io_service, std::atoi(argv[1]));
io_service.run();
}
catch (std::exception& e)
{
std::cerr << "Exception: " << e.what() << "n";
}
return 0;
}
adl仅将参数的名称空间添加到应该查找名称的名称空间列表中(这不是很精确,但出于您的问题的目的,它足够了)。它不会自动在该名称空间中超负荷。如果发现了两个同等排名的匹配,则仍然发生模棱两可。在您的情况下,两者完全相同。
如果您阅读了链接的ASIO文档,您将知道声明ADL超载的正确方法是
void* asio_handler_allocate(size_t, Handler);
其中Handler
是用户定义的处理程序类型。上述声明也可能具有Handler
的CV预选赛。在这种情况下,发现的两个过载是一个带有第二个参数的混凝土类型,另一个带有...
。任何 Legal 与键入参数匹配的排名都高于variadic参数(不要与C 11 variadic模板参数相混淆)。因此,不会有模棱两可的匹配
- 运行同一解决方案的另一个项目的项目
- Project Euler问题4的错误解决方案
- 计算每个节点的树高,帮助我解释这个代码解决方案
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- visual c++,如何获取解决方案目录中的代码
- 有没有办法在远程设备上打开和编辑visual Studio 2017解决方案
- C++Matching Brackets 2解决方案不起作用
- 在 ubuntu3 上C++ goto 定义有什么解决方案吗16.04?
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 我的固定时间步长与增量时间和插值的解决方案是错误的吗?
- 无法在问题解决方案中执行输出逻辑
- 最大的回文产品 - 程序未运行,编写解决方案但无法理解问题
- 从预序遍历构造 bst 的 c++ 和 python 解决方案之间的区别
- 在一个解决方案中针对第三方静态库 (Creo) 的不同版本(版本)进行构建
- 如何巧妙地编写两个函数——一个用于检查是否存在解决方案,另一个用于获取所有解决方案
- 使用 Git 处理 C++ Visual Studio 2019 解决方案的外部依赖项源代码管理的最佳方法是什么?
- N-queen问题:无法弄清楚为什么我的解决方案不起作用
- 从排序数组中删除重复项,具有不同代码方式的相同解决方案具有不同的输出
- 为什么这种ADL解决方案歧义
- c++中按引用传递和按值传递之间重载歧义的实用解决方案