我只是将带有终点向量的共享指针的类作为私有,
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)
{
}
但intellisense告诉我,论证是不同的
参数是端点向量和std分配器的共享指针,
由于std分配器部分,它给出了错误
我不知道为什么矢量改为采用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;
};
答案 0 :(得分:0)
但intellisense告诉我,论证是不同的。 参数是端点向量和std分配器的共享指针, 并且由于std allocator部分,它给出了错误。 我不知道为什么向量改为采用std分配器部分,我甚至不知道什么是std分配器,从未使用过它。
这不是问题。 std::vector<T>
始终等同于std::vector<T, std::allocator<T> >
(因为默认模板参数:http://en.cppreference.com/w/cpp/container/vector
这不是问题:
<强> Live On Coliru 强>
#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
<强> Live On Coliru 强>
#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);
}
}