【发布时间】:2015-04-08 21:07:01
【问题描述】:
#include <memory>
#include <iostream>
#include <exception>
#include <curl/curl.h>
class client
{
private:
std::unique_ptr<CURL, decltype(&psclient::del_curl)> uptr_curl_;
inline CURL * init_curl()
{
CURLcode result = curl_global_init(CURL_GLOBAL_DEFAULT);
if(result != CURLE_OK)
throw std::logic_error(curl_easy_strerror(result));
return curl_easy_init();
}
inline void del_curl(CURL * ptr_curl)
{
curl_easy_cleanup(ptr_curl);
curl_global_cleanup();
}
public:
inline client()
: uptr_curl_(init_curl(), &client::del_curl)
{
}
}
编译器一直在抱怨No matching constructor for initialization of 'std::unique_ptr<CURL, void (*)(CURL *)>'
在我看来,deleter 模板参数的声明是正确的。它是一个返回 void 并将 CURL * 作为参数的函数指针。这与del_curl 的签名相匹配。
在 C++ 中是否还有另一个我不知道的随机规则指定了对非静态成员函数指针的模板参数的要求?如果有,为什么?
【问题讨论】:
-
将
void del_curl(CURL * ptr_curl);从非静态成员函数更改为静态成员函数。 -
@FranciscoAguilera 因为您试图将指向函数的指针绑定到指向成员函数的指针,但这不起作用:
uptr_curl_(init_curl(), &client::del_curl) -
@FranciscoAguilera 因为您的陈述“这与 del_curl 的签名相匹配”是错误的。它确实 not 匹配。
void (*)(CURL*)与void (client::*)(CURL*)不同。一个是会员(需要this),另一个不是。 它们不是同一类型。你可以全大写为什么你想要的;但这就是为什么,不管你喜不喜欢。 -
@vsoftco 是的,它应该以某种方式工作,因为我不希望那些是静态函数。它们不是静态的。对于
client的所有实例,没有1 个大curl_init,它们对于每个客户端都是唯一的。 -
不,它确实不匹配,并且您的问题中没有任何内容与模板实际相关。指向函数的指针不能指向指向成员函数的指针,这在模板之外也是不可能的,而且从根本上来说是不可能的。花点时间想想它是如何工作的。您需要一些实例来调用非静态成员函数。您没有任何可用的实例来调用它,也没有任何空间来跟踪实例。所以你不能调用它。我很确定这已经被问过了。让我看看我能不能找到一个好的副本。
标签: c++ unique-ptr