std :: make_shared无法正常工作,但是使用“ new”创建指针可以正常工作

时间:2019-09-22 21:02:33

标签: c++ makefile std shared

我目前正在为我的游戏引擎制作GUI系统。我尝试使用std::make_shared()为组件“ GUImovingbar”之一创建共享指针,但是在编译时出现以下错误

  

'std :: shared_ptr <_Other> std :: make_shared(_Types && ...)':无法从“初始化程序列表”推论出“ _Types && ...”的模板参数

但是,当我使用完全相同的输入来创建新指针时,它可以正常编译且没有错误。这让我有些奇怪。我在这里想念什么?

使用std::make_shared()的代码:

this->playerhullbar = std::make_shared<GUImovingbar>(
    "right",
    { 50,hully }, //scoords
    globalguitextures[findStringSrdPointerPairVectElement(globalguitextures, "barbackground")].second,
    { 0,static_cast<double>(maxplayerhullint),static_cast<double>(maxplayerhullint) },
    { 50,hully,250, hully,2,100 },//for int vector input ("bsbebdbc"): 1  barxstart, 2  y , 3 barendx, 4 y, 5 distance between bars in px, 6 bar count
    { 0,255,0 },
    bartextvect
    );

以上导致错误:

  

'std :: shared_ptr <_Other> std :: make_shared(_Types && ...)':无法从“初始化程序列表”推论出“ _Types && ...”的模板参数

以下内容完全不会导致错误:

std::shared_ptr<GUImovingbar> newptr(new GUImovingbar(
    "right",
    { 50,hully}, //scoords
    globalguitextures[findStringSrdPointerPairVectElement(globalguitextures, "barbackground")].second,
    { 0,static_cast<double>(maxplayerhullint),static_cast<double>(maxplayerhullint) },
    { 50,hully,250, hully,2,100 },//for int vector input ("bsbebdbc"): 1  barxstart, 2  y , 3 barendx, 4 y, 5 distance between bars in px, 6 bar count
    { 0,255,0 },
    bartextvect)
); 
this->playerhullbar = newptr;

2 个答案:

答案 0 :(得分:0)

作为模板函数,std::make_shared尝试根据给定的参数为您的类找到合适的构造函数。既然已经给它提供了初始化程序列表(括号中的内容),那么对于这些​​列表应该初始化的类型感到困惑,因此找不到合适的构造函数。但是,当您正确使用构造函数时,可以消除歧义,因为由于参数的位置,编译器知道列表应该初始化的类型,并对其进行相应的转换。

如果您仍然想使用std::make_shared,则必须通过将初始化列表的类型放在列表之前来消除它们的歧义:

this->playerhullbar = std::make_shared<GUImovingbar>(
    "right",
    Scoords { 50,hully },
    globalguitextures[findStringSrdPointerPairVectElement(globalguitextures, "barbackground")].second,
    Rect { 0,static_cast<double>(maxplayerhullint),static_cast<double>(maxplayerhullint) },
    std:vector<int> { 50,hully,250, hully,2,100 },
    Color { 0,255,0 },
    bartextvect
);

(或者,如果您使用的是旧的编译器,也请使用带括号的旧语法:std:vector<int>({ 50,hully,250, hully,2,100 })

答案 1 :(得分:0)

问题在于您在make_shared调用中正在执行的聚合初始化。如果使用new GUImovingbar(...)创建对象,则直接调用构造函数,因此,编译器确切知道哪个参数属于哪种类型。这使您可以汇总初始化的自变量。

但是,如果调用make_shared,则必须从传递给函数的值中推导出所有参数(因为它是模板)。基本上是这样的:

auto x = {10, "hello", 4};

编译器应如何知道它实际上是什么类型?

如果您仍想使用make_shared,则必须使用其名称来显式初始化类型。