![](/img/trans.png)
[英]Accessing std::vector containing boost::shared_ptr<CustomObj> -> does at() return a copy of shared pointer?
[英]shared pointer to vector returning different shared pointer containing std allocator
我只是简单地用指向终点向量的共享指针作为类,
class HTTPService_resolve
{
public:
HTTPService_resolve();
HTTPService_resolve(std::string);
boost::shared_ptr<std::vector<boost::asio::ip::tcp::endpoint>> resolve_func();
boost::shared_ptr<std::vector<boost::asio::ip::tcp::endpoint>> resolve_func(std::string);
boost::asio::io_service& get_service_reference();
boost::shared_ptr<std::vector<boost::asio::ip::tcp::endpoint>> get_vec_endpoints_ptr();
private:
boost::asio::io_service service_resolve_ios;
std::string service_resolve_protocol_host_URL;
std::string host_name;
std::string port_service;
boost::asio::ip::tcp::resolver protocol_host_URL_resolver{ service_resolve_ios };
boost::shared_ptr<std::vector<boost::asio::ip::tcp::endpoint>> vec_endpoints_ptr = boost::make_shared<std::vector<boost::asio::ip::tcp::endpoint>>();//(new HTTPResponse);
};
然后我做了方法来获取此共享的指针,该方法返回共享的指针,
boost::shared_ptr<std::vector<boost::asio::ip::tcp::endpoint>> HTTPService_resolve::get_vec_endpoints_ptr()
{
return vec_endpoints_ptr;
}
在其他类的构造函数中,该类声明将参数作为向量的共享指针,我通过了先前的方法。
HTTPClient::HTTPClient(const symbols_enum symbol = symbols_enum::EURUSD, date day = date(2012, Jan, 10), boost::shared_ptr<std::vector<boost::asio::ip::tcp::endpoint>> client_vec_endpoints_ptr) :
symbol(symbol),
day(day),
client_vec_endpoints_ptr(client_vec_endpoints_ptr)
{
}
但是智能感知告诉我,论点是不同的。
该参数是指向端点和std分配器的向量的共享指针,
并且由于std分配器部分,它给出了错误。
我不知道为什么向量变成标准分配器的一部分,我什至不知道什么是标准分配器,并且以前从未使用过。
这是显示其方法和成员的客户端类:
class HTTPClient
{
friend class HTTPService_resolve;
public:
/*
// set up the worker threads in a thread group
22 boost::thread_group workers;
23 for (int i = 0; i < 3; ++i) {
24 workers.create_thread([&service, &mtx]() {
25 PRINT_ARGS("Starting worker thread ");
26 service.run();
27 PRINT_ARGS("Worker thread done");
28 });
29 }
*/
HTTPClient(const symbols_enum, date);
HTTPClient(const symbols_enum, date, boost::shared_ptr<std::vector<boost::asio::ip::tcp::endpoint>>);
boost::asio::io_service& HTTPClient::get_service_reference();
boost::shared_ptr<HTTPRequest> create_request(unsigned int);
boost::shared_ptr<HTTPRequest> create_request(unsigned int, std::string);
//void create_tasks(const symbols_enum&, date);
void create_tasks(const symbols_enum , date);
void fetch_day();
void close();
private:
//boost::asio::io_service m_ios;//HTTPService_resolve>>1
boost::asio::io_service m_ios;
std::unique_ptr<boost::asio::io_service::work> m_work;
std::unique_ptr<boost::thread> m_thread;
symbols_enum symbol = symbols_enum::EURUSD;
date day = date(2012, Jan, 10);
boost::shared_ptr<std::vector<boost::asio::ip::tcp::endpoint>> client_vec_endpoints_ptr;
};
但是智能感知告诉我,论点是不同的。 该参数是端点和std分配器的向量的共享指针,并且由于std分配器的一部分,会产生错误。 我不知道为什么向量变成标准分配器的一部分,我什至不知道什么是标准分配器,并且以前从未使用过。
那不是问题。 std::vector<T>
始终等价于std::vector<T, std::allocator<T> >
(由于默认模板参数: http : //en.cppreference.com/w/cpp/container/向量
这不成问题:
#include <memory>
#include <vector>
#include <boost/asio.hpp>
enum class Symbol { EURUSD };
using Date = boost::gregorian::date;
using Endpoint = boost::asio::ip::tcp::endpoint;
using Endpoints = std::vector<Endpoint>;
using SharedEndpoint = std::shared_ptr<Endpoint>;
using SharedEndpoints = std::shared_ptr<Endpoints>;
struct HTTPService {
SharedEndpoints get_endpoints() const { return _endpoints; }
private:
SharedEndpoints _endpoints = std::make_shared<Endpoints>();
};
struct HTTPClient {
HTTPClient(Symbol sym, Date date, SharedEndpoints endpoints) : _sym(sym), _date(date), _endpoints(endpoints) {}
private:
Symbol _sym;
Date _date;
SharedEndpoints _endpoints;
};
int main() {
HTTPService svc;
HTTPClient client1(Symbol::EURUSD, Date(2012, 1, 1), svc.get_endpoints());
HTTPClient client2(Symbol::EURUSD, Date(2012, 1, 2), svc.get_endpoints());
}
您似乎只希望客户端拥有一个端点(在此处猜测)。 满足别名构造函数的要求: http : //en.cppreference.com/w/cpp/memory/shared_ptr/shared_ptr
#include <memory>
#include <vector>
#include <boost/asio.hpp>
enum class Symbol { EURUSD };
using Date = boost::gregorian::date;
using Endpoint = boost::asio::ip::tcp::endpoint;
using Endpoints = std::vector<Endpoint>;
using SharedEndpoint = std::shared_ptr<Endpoint>;
using SharedEndpoints = std::shared_ptr<Endpoints>;
struct HTTPService {
SharedEndpoints get_endpoints() const { return _endpoints; }
private:
SharedEndpoints _endpoints = std::make_shared<Endpoints>();
};
struct HTTPClient {
HTTPClient(Symbol sym, Date date, SharedEndpoint endpoint) : _sym(sym), _date(date), _endpoint(endpoint) {}
private:
Symbol _sym;
Date _date;
SharedEndpoint _endpoint;
};
int main() {
HTTPService svc;
std::vector<HTTPClient> clients;
auto shared_endpoints = svc.get_endpoints();
for(auto ep : *shared_endpoints) {
// alias a shared endpoint pointer to the lifetime of the endpoint vector
SharedEndpoint sep(shared_endpoints, &ep);
clients.emplace_back(Symbol::EURUSD, Date(2012, 1, 1), sep);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.