我目前正在为我的游戏引擎制作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;
答案 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
,则必须使用其名称来显式初始化类型。