Как использовать шаблон в шаблоне в C ++ 11? - PullRequest
0 голосов
/ 15 мая 2019

Я использую boost для создания сервера websocket. Потому что нам нужны две версии ws и wss, поэтому я пишу код, как показано ниже. Но когда я его собрал, сказал "ошибка C2338: неизвестный тип сокета в async_teardown."

Полагаю, это из-за T1.

файл 1 iSession.h '' '

//
// Created by p00451414 on 2019/5/14.
//

#ifndef ESDK_MSP_ISESSION_H
#define ESDK_MSP_ISESSION_H
#pragma once
#include "stdfax.h"


template<typename T>
class iSession :public std::enable_shared_from_this <iSession<T>> {
public:
    /*explicit
        iSession(boost::asio::ip::tcp::socket);
    explicit
        iSession(boost::asio::ip::tcp::socket, boost::asio::ssl::context&);*/

    iSession() {
        ws_ = NULL;
        strand_ = NULL;
        buffer_ = new boost::beast::multi_buffer();
    }
    ~iSession() {
        delete buffer_;
        buffer_ = NULL;
        delete strand_;
        strand_ = NULL;
        delete ws_;
        ws_ = NULL;

    }

public:
    boost::beast::websocket::stream<T> *ws_=NULL;
    boost::asio::strand<boost::asio::io_context::executor_type> *strand_=NULL;
    boost::beast::multi_buffer *buffer_=NULL;
public:
    void virtual run() = 0;

    void process() {
        auto sp = shared_from_this();

        ws_->async_read(*buffer_, boost::asio::bind_executor(*strand_, [&, sp](boost::system::error_code ec2,
            std::size_t bytes_transferred2) {
            boost::ignore_unused(bytes_transferred2);
            if (ec2) {
                //   fail(ec, "read");
            }


            if (ec2 == boost::beast::websocket::error::closed) {
                return;
            }
            ws_->text(ws_->got_text());
            ws_->async_write(buffer_->data(), boost::asio::bind_executor(*strand_, [&, sp](boost::system::error_code ec3,
                std::size_t bytes_transferred3) {
                boost::ignore_unused(bytes_transferred3);
                if (ec3) {
                    //   return fail(ec, "write");
                }


                // Clear the buffer
                buffer_->consume(buffer_->size());
                process();
            }));

        }));
    }

};


#endif //ESDK_MSP_ISESSION_H

'' '

file2 NormalSession.h '' '

//
// Created by p00451414 on 2019/5/14.
//

#ifndef ESDK_MSP_NORMALSESSION_H
#define ESDK_MSP_NORMALSESSION_H



#include "iSession.h"

class NormalSession : public iSession<boost::asio::ip::tcp::socket> {
public:
    NormalSession(boost::asio::ip::tcp::socket);

    ~NormalSession();

public:


    void run();
};


#endif //ESDK_MSP_NORMALSESSION_H

'' '

файл 3 SslSession.h '' '

//
// Created by p00451414 on 2019/5/14.
//

#ifndef ESDK_MSP_SSLSESSION_H
#define ESDK_MSP_SSLSESSION_H


#include <memory>
#include <boost/asio/ip/tcp.hpp>


#include "iSession.h"


class SslSession : public iSession<boost::asio::ssl::stream<boost::asio::ip::tcp::socket&>> {
public:
    SslSession(boost::asio::ip::tcp::socket, boost::asio::ssl::context &);

    ~SslSession(void);

public:
    void on_handshake(boost::system::error_code);

    //void on_accept(boost::system::error_code);

    //void do_read();

    //void on_read(boost::system::error_code, std::size_t);

    //void on_write(boost::system::error_code, std::size_t);

    void run();

private:
    boost::asio::ip::tcp::socket* socket_;
};


#endif //ESDK_MSP_SSLSESSION_H

'' '

Полагаю, это из-за моей SslSession с шаблоном T1. Потому что мой класс NormalSession мог работать, когда SslSession комментировал.

Так как исправить эту ошибку и как использовать шаблон в шаблоне?

больше сообщений

больше сообщений

'' '

F: \ boost_1_69_0 \ boost_1_69_0 \ boost / beast / websocket / teardown.hpp (103): ошибка C2338: неизвестный тип сокета в async_teardown. F: \ boost_1_69_0 \ boost_1_69_0 \ boost / beast / websocket / impl / read.ipp (680): примечание: oid 对 正在 编译 的 函数 模板 实例 化 «void boost :: beast :: websocket :: async_teardown :: read_some_op>: : mutable_buffers_type, boost :: beast :: websocket :: stream :: read_op> :: process ::, boost :: asio :: strand >>>> (boost :: beast :: websocket :: role_type, Socket &, TeardownHandler &&)»的 引用 с [ NextLayer = повышение :: ASIO :: :: поток SSL, DynamicBuffer = повышение :: зверь :: multi_buffer, Оправа = повышение :: ASIO :: :: поток SSL, TeardownHandler = повышение :: зверем :: WebSocket :: поток, правда> :: read_some_op> :: mutable_buffers_type, повышение :: зверю :: WebSocket :: поток, правда> :: read_op> :: процесс ::, повышение :: ASIO :: нитка >>> ] F: \ boost_1_69_0 \ boost_1_69_0 \ boost / beast / websocket / impl / read.ipp (173): примечание: oid 类 模板 成员 函数 "void boost :: beast :: websocket :: stream :: read_some_op> :: mutable_buffers_type, boost :: beast :: websocket :: stream :: read_op :: process ::, boost :: asio :: strand >>> :: operator () (boost :: beast :: error_code, size_t, bool) "时 с [ T = повышение :: ASIO :: :: поток SSL, DynamicBuffer = повышение :: зверя :: multi_buffer ] F: \ boost_1_69_0 \ boost_1_69_0 \ boost / beast / websocket / impl / read.ipp (821): примечание: «void boost :: beast :: websocket :: stream :: read_some_op>: : mutable_buffers_type, boost :: beast :: websocket :: stream :: read_op :: process ::, boost :: asio :: strand >>> :: operator () (boost :: beast :: error_code, size_t, bool) «的 引用 с [ T = повышение :: ASIO :: :: поток SSL, DynamicBuffer = повышение :: зверя :: multi_buffer ] F: \ boost_1_69_0 \ boost_1_69_0 \ boost / beast / websocket / impl / read.ipp (821): примечание: «boost :: beast :: websocket :: stream :: read_some_op> :: mutable_buffers_type, boost :: beast :: websocket :: stream :: read_op :: process ::, boost :: asio :: strand >>> "的 引用 с [ T = повышение :: ASIO :: :: поток SSL, DynamicBuffer = повышение :: зверя :: multi_buffer ] F: \ boost_1_69_0 \ boost_1_69_0 \ boost / beast / websocket / impl / read.ipp (802): примечание: oid 类 模板 成员 函数 "void boost :: beast :: websocket :: stream :: read_op :: process ::, boost :: asio :: strand >> :: operator () (boost :: beast :: error_code, size_t) "时 с [ T = повышение :: ASIO :: :: поток SSL, DynamicBuffer = повышение :: зверя :: multi_buffer ] F: \ boost_1_69_0 \ boost_1_69_0 \ boost / beast / websocket / impl / read.ipp (899): примечание: «void boost :: beast :: websocket :: stream :: read_op ::» process ::, boost :: asio :: strand >> :: operator () (boost :: beast :: error_code, size_t) ”的 引用 с [ T = повышение :: ASIO :: :: поток SSL, DynamicBuffer = повышение :: зверя :: multi_buffer ] F: \ boost_1_69_0 \ boost_1_69_0 \ boost / beast / websocket / impl / read.ipp (899): примечание: "boost :: beast :: websocket :: stream :: read_op :: process" ::, boost :: asio :: strand >> "的 引用 с [ T = повышение :: ASIO :: :: поток SSL, DynamicBuffer = повышение :: зверя :: multi_buffer ] f: \ msp \ esdk_icp \ source \ esdk_msp \ msp_s \ src \ websocket \ iSession.h (69): примечание: :: process ::, boost :: asio :: strand >> (DynamicBuffer &, ReadHandler &&) ”的 引用с [ T = повышение :: ASIO :: :: поток SSL, DynamicBuffer = повышение :: зверь :: multi_buffer, ReadHandler = повышение :: ASIO :: executor_binder> :: Процесс ::, повышение :: ASIO :: нитка> ] f: \ msp \ esdk_icp \ source \ esdk_msp \ msp_s \ src \ websocket \ iSession.h (44): примечание: нет void boost :: beast :: websocket :: stream :: async_read :: process ::, boost :: asio :: strand >> (DynamicBuffer &, ReadHandler &&) ”的 引用 с [ T = повышение :: ASIO :: :: поток SSL, DynamicBuffer = повышение :: зверь :: multi_buffer, ReadHandler = повышение :: ASIO :: executor_binder> :: Процесс ::, повышение :: ASIO :: нитка> ] f: \ msp \ esdk_icp \ source \ esdk_msp \ msp_s \ src \ websocket \ iSession.h (41): примечание: oid 类 模板 成员 函数 "void iSession> :: process (void)" 时 F: \ MSP \ eSDK_ICP \ Source \ eSDK_MSP \ MSP_S \ src \ websocket \ SslSession.cpp (44): примечание: "void iSession> :: process (void)" 的 化 f: \ msp \ esdk_icp \ source \ esdk_msp \ msp_s \ src \ websocket \ SslSession.h (16): примечание: i 对 正在 编译 的 的 类 模板 i i iSession> F: \ boost_1_69_0 \ boost_1_69_0 \ boost / beast / core / string.hpp (103): примечание: "boost :: basic_string_view>" 的 引用 NMAKE: фатальная ошибка U1077: «D: \ VS2017 \ VC \ Tools \ MSVC \ 14.16.27023 \ bin \ Hostx64 \ x64 \ cl.exe»: 返回 代码 «0x2» Стоп. NMAKE: фатальная ошибка U1077: «D: \ VS2017 \ VC \ Tools \ MSVC \ 14.16.27023 \ bin \ Hostx64 \ x64 \ nmake.exe»: 返回 代码 «0x2» Стоп. NMAKE: фатальная ошибка U1077: «D: \ VS2017 \ VC \ Tools \ MSVC \ 14.16.27023 \ bin \ Hostx64 \ x64 \ nmake.exe»: 返回 代码 «0x2» Стоп. NMAKE: фатальная ошибка U1077: «D: \ VS2017 \ VC \ Tools \ MSVC \ 14.16.27023 \ bin \ Hostx64 \ x64 \ nmake.exe»: 返回 代码 «0x2» Стоп.

'' '

1 Ответ

0 голосов
/ 15 мая 2019

Понял, после прочтения исходного кода прочитал комментарии в teardown.hpp, забыл включить #include <boost/beast/websocket/ssl.hpp>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...