无法使用两个包装不同下一层的ssl_stream编译代码
Can't compile code with two ssl_stream that wrap different next layers
我想了解为什么在为 tcp 层创建两个包装不同对象的ssl_streams时,出现以下编译错误:
------ Build started: Project: test, Configuration: Debug x64 ------
>Microsoft (R) C/C++ Optimizing Compiler Version 19.22.27905 for x64
>Copyright (C) Microsoft Corporation. All rights reserved.
>cl /c /I"D:workspaceopenssl-staticopenssl-OpenSSL_1_1_1aopenssl-OpenSSL_1_1_1ainclude" /ID:workspaceboostVS19boost_1_70_0 /Zi /W3 /WX- /diagnostics:column /Od /Ob0 /D WIN32 /D _WINDOWS /D _WIN32_WINNT=0x0600 /D _SILENCE_CXX17_ALLOCATOR_VOID_DEPRECATION_WARNING /D "CMAKE_INTDIR="Debug"" /D _MBCS /Gm- /EHsc /RTC1 /MTd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /GR /std:c++17 /Fo"test.dirDebug\" /Fd"test.dirDebugvc142.pdb" /Gd /TP /errorReport:prompt D:workspacemain.cpp
>main.cpp
>D:workspaceboostVS19boost_1_70_0boost/beast/ssl/ssl_stream.hpp(655,5): error C2995: 'void boost::beast::teardown(boost::beast::role_type,boost::beast::ssl_stream<NextLayer> &,boost::system::error_code &)': function template has already been defined
>D:workspaceboostVS19boost_1_70_0boost/beast/ssl/ssl_stream.hpp(655): message : see declaration of 'boost::beast::teardown'
>D:workspacemain.cpp(12): message : see reference to class template instantiation 'boost::beast::ssl_stream<boost::asio::ip::tcp::socket>' being compiled
>D:workspaceboostVS19boost_1_70_0boost/beast/ssl/ssl_stream.hpp(668,5): error C2995: 'void boost::beast::async_teardown(boost::beast::role_type,boost::beast::ssl_stream<NextLayer> &,TeardownHandler &&)': function template has already been defined
>D:workspaceboostVS19boost_1_70_0boost/beast/ssl/ssl_stream.hpp(668): message : see declaration of 'boost::beast::async_teardown'
>Done building project "test.vcxproj" -- FAILED.
如果两个流具有相同的模板参数(即,两者都具有 boost::beast::tcp_stream或boost::asio::ip::tcp::socket),则所有错误都会消失。
#include <boost/asio/io_context.hpp>
#include <boost/asio/ip/tcp.hpp>
#include <boost/asio/ssl/context.hpp>
#include <boost/beast/core/tcp_stream.hpp>
#include <boost/beast/ssl/ssl_stream.hpp>
int main() {
boost::asio::io_context ioc;
boost::asio::ssl::context ctx(boost::asio::ssl::context::sslv23_client);
ctx.set_default_verify_paths();
boost::beast::ssl_stream<boost::beast::tcp_stream> stream_1(ioc, ctx);
boost::beast::ssl_stream<boost::asio::ip::tcp::socket> stream_2(ioc, ctx);
}
我想了解这是一个错误,还是所需的行为。如果是第二个,如果有人向我解释原因,那就太好了。另外,我想更好地了解在什么情况下值得使用tcp_stream,以及在哪些情况下使用套接字。
我认为这是野兽中的错误/QOI问题。它声明模板友元函数 在类声明中,即teardown
.
但是模板友元并不依赖于所有类模板模板参数,因此下一次与其他模板参数ssl_stream<>
实例定义了相同的模板友元函数。
简单的解决方法是使定义脱离类和朋友 仅在类主体中声明。
所以,它变成了:
template<class NextLayer>
class ssl_stream
: public net::ssl::stream_base
{
// ... many lines snipped ...
#if ! BOOST_BEAST_DOXYGEN
template<class SyncStream>
friend
void
teardown(
boost::beast::role_type role,
ssl_stream<SyncStream>& stream,
boost::system::error_code& ec);
template<class AsyncStream, class TeardownHandler>
friend
void
async_teardown(
boost::beast::role_type role,
ssl_stream<AsyncStream>& stream,
TeardownHandler&& handler);
#endif
};
template<class SyncStream>
static inline void
teardown(
boost::beast::role_type role,
ssl_stream<SyncStream>& stream,
boost::system::error_code& ec)
{
// Just forward it to the underlying ssl::stream
using boost::beast::websocket::teardown;
teardown(role, *stream.p_, ec);
}
template<class AsyncStream, class TeardownHandler>
static inline void
async_teardown(
boost::beast::role_type role,
ssl_stream<AsyncStream>& stream,
TeardownHandler&& handler)
{
// Just forward it to the underlying ssl::stream
using boost::beast::websocket::async_teardown;
async_teardown(role, *stream.p_,
std::forward<TeardownHandler>(handler));
}
我已经为此打开了一个问题+拉取请求我打算打开一个拉取请求,但似乎相同的修复程序 (yay) 已经登陆 开发 在 1de60a046292dcd42bb0097176e0139ba4ad051b 中,该修复程序在
master
中并标记为boost-1.71.0
和boost-1.71.0.beta1
相关文章:
- 循环中的变量被设置为下一个数组的元素始终具有相同的内存地址?
- 无法使用两个包装不同下一层的ssl_stream编译代码
- 使用 fstream 在空格分隔文件中查看下一项(不仅仅是一个字符)的方法
- GoogleMock:如何保存参数,以便在模拟上的下一次调用中使用
- switch 语句结束和下一条语句之间的时间是否具有确定性(与路径无关)
- C++显示图像并将其保持到下一张图像的最佳方法
- Windows 10 下的 Winhttp SSL 问题
- 在C++中,文件中的下一条记录被非法更新
- 为什么弦乐在代表时不会移至下一组字符
- 检查下一步是检查员
- 如果没有线程阻塞信号,并且有一个线程处于"sigwait()"中,是否可以保证被阻塞的线程将接收下一
- QT4 QListView保存图标位置下一次由手动移动
- 改进malloc()算法的下一步是什么
- C++:为什么创建的向量没有传递到下一组 for 循环
- 需要帮助来理解下一节课的目的
- 使数据输入字段记住其值,从一次运行到下一次运行
- 设置GL_TEXTURE_MAX_ANISOTROPY_EXT会导致下一帧崩溃
- 如何将值从一个数组移动到下一个数组
- 带有下一步/后退按钮的Qt对话框/小部件
- 写入纹理数组的一层并从另一层读取