Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++11 使用std::unique\u ptr作为隐式值创建std::pair或std::map_C++11_Stdmap_Std Pair - Fatal编程技术网

C++11 使用std::unique\u ptr作为隐式值创建std::pair或std::map

C++11 使用std::unique\u ptr作为隐式值创建std::pair或std::map,c++11,stdmap,std-pair,C++11,Stdmap,Std Pair,此代码在Visual Studio中工作: typedef struct { int a; } data_t; using datap_t = std::unique_ptr<data_t>; using MyPair = std::pair<std::string, datap_t>; int main() { data_t * pd1 = new data_t(); MyPair p("tst", pd1); // This does no

此代码在Visual Studio中工作:

typedef struct {
    int a;
} data_t;

using datap_t = std::unique_ptr<data_t>;
using MyPair = std::pair<std::string, datap_t>;

int main() {
    data_t * pd1 = new data_t();
    MyPair p("tst", pd1); // This does not compile in gcc or clang
    // MyPair p2("tst", datap_t(pd1)); // This compiles

    return 0;
}
typedef结构{
INTA;
}数据;
使用datap_t=std::unique_ptr;
使用MyPair=std::pair;
int main(){
data_t*pd1=新数据_t();
MyPair p(“tst”,pd1);//这不在gcc或clang中编译
//MyPair p2(“tst”,datap_t(pd1));//编译
返回0;
}
但clang和gcc给出了错误:

error: no matching function for call to 'std::pair<const std::basic_string<char>, std::unique_ptr<data_t> >::pair(const char [3], data_t*&)
错误:调用'std::pair::pair(const char[3],data_t*&]时没有匹配的函数
是要尝试的表意文字

事实上,我可以调用
datap\u t(pd1)
并编译它,这意味着构造函数是有效的,那么为什么该模板找不到合适的匹配项呢

我希望使用emplace将键值对添加到地图中,这就是为什么我首先希望进行这种隐式转换。请注意,与Visual Studio一样,隐式转换也适用于大多数其他类型,例如
std::string
中的
“原始字符串”


看起来相关,但它谈论的是一个固定的错误,而且非常古老。

将单个原始指针作为输入的
std::unique_ptr
构造函数标记为
explicit
,以防止隐式转换

pd1
是一个原始指针<代码>MyPair p(“tst”,pd1)涉及到到到std::unique_ptr的隐式转换,这就是编译在Clang和GCC中失败的原因。您必须改用显式转换:

MyPair p("tst", datap_t(pd1));
更好的选择是根本不使用原始指针:

MyPair p("tst", std::make_unique<data_t>());
MyPair p(“tst”,std::make_unique());

Clang和GCC做的是正确的,Visual Studio没有(尽管它显示相关的构造函数是显式的)。

采用单个原始指针作为输入的
std::unique_ptr
构造函数被标记为
显式的
,以防止隐式转换

pd1
是一个原始指针<代码>MyPair p(“tst”,pd1)涉及到到到std::unique_ptr的隐式转换,这就是编译在Clang和GCC中失败的原因。您必须改用显式转换:

MyPair p("tst", datap_t(pd1));
更好的选择是根本不使用原始指针:

MyPair p("tst", std::make_unique<data_t>());
MyPair p(“tst”,std::make_unique());

Clang和GCC做的是正确的,Visual Studio没有(尽管它显示相关的构造函数是显式的。

不要使用原始指针
auto pd1=std::make_unique()
@kfsone我不知道,当处理外部C库时,处理原始指针是不可避免的。另外,我很想知道为什么这在VisualStudio中可以工作,而不是叮当作响,也不想知道如何使它工作:)不要使用原始指针
auto pd1=std::make_unique()
@kfsone我不知道,当处理外部C库时,处理原始指针是不可避免的。另外,我很想知道为什么这在VisualStudio中有效,而不是clang,而不是寻找如何使其有效:)