C++ 以共享指针为参数创建对象的共享指针

C++ 以共享指针为参数创建对象的共享指针,c++,object,shared-ptr,C++,Object,Shared Ptr,尝试创建对象的std::shared_ptr,该对象将std::shared_ptr作为参数,导致“没有用于初始化“对象”的匹配构造函数”编译错误 我的代码如下所示: // Sidebar Widgets _widgets.sideBarWidgetLeft = std::make_shared<SideBarWidget>(); _widgets.sideBarWidgetLeft->hide(); _widgets.sideBarWidgetRight = st

尝试创建对象的
std::shared_ptr
,该对象将
std::shared_ptr
作为参数,导致“没有用于初始化“对象”的匹配构造函数”编译错误

我的代码如下所示:

// Sidebar Widgets
  _widgets.sideBarWidgetLeft = std::make_shared<SideBarWidget>();
  _widgets.sideBarWidgetLeft->hide();
  _widgets.sideBarWidgetRight = std::make_shared<SideBarWidget>();
  _widgets.sideBarWidgetRight->hide();

  // Pointer Test
  CalibrationManagementWidget* test = new CalibrationManagementWidget( _widgets.sideBarWidgetLeft, 0 );

  // Sidebar Left
  _widgets.calibrationManagementWidget = std::make_shared<CalibrationManagementWidget>( _widgets.sideBarWidgetLeft, 0 );
  _widgets.calibrationManagementWidget->hide();
  _widgets.cameraWidget = std::make_shared<CameraWidget>( 0, VISUALISATION_TYPE_NORMAL );
  _widgets.cameraWidget->hide();
//侧栏小部件
_widgets.sideBarWidgetLeft=std::make_shared();
_sideBarWidgetLeft->hide();
_widgets.sideBarWidgetRight=std::make_shared();
_sideBarWidgetRight->hide();
//指针测试
CalibrationManagementWidget*测试=新的CalibrationManagementWidget(_widgets.sideBarWidgetLeft,0);
//左侧边栏
_widgets.calibrationManagementWidget=std::使_共享(_widgets.sideBarWidgetLeft,0);
_校准管理小部件->隐藏();
_widgets.cameraWidget=std::使共享(0,可视化类型正常);
_widgets.cameraWidget->hide();
虽然“指针测试”编译得很好,“左侧边栏”下的行创建命名错误。实例化时是否有我做错的事情,或者这在一般情况下是不可能的

以下是(其中一条)错误消息:

/usr/include/c++/5.4.0/ext/new_分配器。h:120:错误:没有用于初始化“CalibrationManagementWidget”的匹配构造函数
{::新建((void*)uu p)u向上(std::转发(u参数));}
^   ~~~~~~~~~~~~~~~~~~~~~~~~~~~
编辑:

根据要求,我将发布一些代码片段,其中还包含CalibrationWidget的构造函数

校准小部件.h

...
Q_INVOKABLE CalibrationManagementWidget(QWidget* parent = 0 , VisualisationType visuType = VISUALISATION_TYPE_TRANSLATOR);
CalibrationManagementWidget( std::shared_ptr<SideBarWidget> sideBarWidget, QWidget* parent = 0 );
virtual ~CalibrationManagementWidget();
...
。。。
Q_可调用校准管理小部件(QWidget*parent=0,VisualizationType=Visualization_TYPE_TRANSLATOR);
CalibrationManagementWidget(std::shared_ptr sideBarWidget,QWidget*parent=0);
虚拟~CalibrationManagementWidget();
...
calibrationwidget.cpp

...
CalibrationManagementWidget::CalibrationManagementWidget(QWidget* parent, enum VisualisationType visuType) : CommonWindowWidget( WIDGET_TYPE_3D, "", "Calibration Management", 0, Ui::UI_WINDOW_FLAG_CLOSABLE, 0, parent, visuType) {
  _currentMessage = 0;
  _selectedCalibrationType = CALIBRATION_TYPE_UNKNOWN;
  _messageEventLoop = new QEventLoop(this);
  _updateTimer = new QTimer();
  setupUi();
}


CalibrationManagementWidget::CalibrationManagementWidget(std::shared_ptr<SideBarWidget> sideBarWidget, QWidget* parent) : CommonWindowWidget( WIDGET_TYPE_3D, "", "Calibration Management", 0, Ui::UI_WINDOW_FLAG_CLOSABLE, sideBarWidget, parent) {
  _currentMessage = 0;
  _selectedCalibrationType = CALIBRATION_TYPE_UNKNOWN;
  _messageEventLoop = new QEventLoop(this);
  _updateTimer = new QTimer();
  setupUi();
}

CalibrationManagementWidget::~CalibrationManagementWidget() {
  delete _messageEventLoop;
  _messageEventLoop = 0;
  delete _updateTimer;
  _updateTimer = 0;
}
...
...
CommonWindowWidget::CommonWindowWidget(WidgetType widgetType, const QString& headerTitle, const string& pageName, unsigned int view, unsigned int uiWindowFlags, std::shared_ptr<SideBarWidget> sideBarWidget, QWidget* parent, VisualisationType visuType) : CommonStackedWidget(widgetType, pageName, view, parent, visuType) {
  _windowFlags = uiWindowFlags;
  _sideBarWidget = std::move(sideBarWidget);

  setupUi();

  _ui.headerWidget->headerLabel()->setText( headerTitle );

  connect( _ui.headerWidget, SIGNAL(headerDoubleClicked()), this, SLOT(changeFoldState()));
  connect( _ui.headerWidget, SIGNAL(changeFoldStateClicked()), this, SLOT(changeFoldState()));
  connect( _ui.headerWidget, SIGNAL(closeClicked()), this, SLOT(navigateToHome()));
}

CommonWindowWidget::~CommonWindowWidget() {

}
...
。。。
CalibrationManagementWidget::CalibrationManagementWidget(QWidget*父项,枚举VisualizationType visuType):CommonWindowWidget(WIDGET_TYPE_3D,“,”校准管理“,0,Ui::Ui_WINDOW_FLAG_CLOSABLE,0,父项,visuType){
_currentMessage=0;
_selectedCalibrationType=校准\类型\未知;
_messageEventLoop=newqeventloop(此);
_updateTimer=新的QTimer();
setupUi();
}
CalibrationManagementWidget::CalibrationManagementWidget(std::shared_ptr sideBarWidget,QWidget*父级):CommonWindowWidget(WIDGET类型_3D,“,”校准管理“,”0,Ui::Ui_WINDOW_FLAG_CLOSABLE,sideBarWidget,父级){
_currentMessage=0;
_selectedCalibrationType=校准\类型\未知;
_messageEventLoop=newqeventloop(此);
_updateTimer=新的QTimer();
setupUi();
}
CalibrationManagementWidget::~CalibrationManagementWidget(){
删除_messageEventLoop;
_messageEventLoop=0;
删除_updateTimer;
_updateTimer=0;
}
...
这里还有来自CommonWindowWidget的片段

commonwindowwidget.h

...
CommonWindowWidget(WidgetType widgetType, const QString& headerTitle = "Foldable Widget", const string& pageName = "Foldable Widget", unsigned int view = 0, unsigned int uiWindowFlags = 0, std::shared_ptr<SideBarWidget> sideBarWidget = 0, QWidget* parent = 0, VisualisationType visuType = VISUALISATION_TYPE_NORMAL);
    virtual ~CommonWindowWidget();
...
。。。
CommonWindowWidget(WidgetType WidgetType,const QString&headerTitle=“Foldable Widget”,const string&pageName=“Foldable Widget”,unsigned int view=0,unsigned int uiWindowFlags=0,std::shared\u ptr sideBarWidget=0,QWidget*parent=0,visualizationType=visualization\u TYPE\u NORMAL);
虚拟~CommonWindowWidget();
...
commonwindowwidget.cpp

...
CalibrationManagementWidget::CalibrationManagementWidget(QWidget* parent, enum VisualisationType visuType) : CommonWindowWidget( WIDGET_TYPE_3D, "", "Calibration Management", 0, Ui::UI_WINDOW_FLAG_CLOSABLE, 0, parent, visuType) {
  _currentMessage = 0;
  _selectedCalibrationType = CALIBRATION_TYPE_UNKNOWN;
  _messageEventLoop = new QEventLoop(this);
  _updateTimer = new QTimer();
  setupUi();
}


CalibrationManagementWidget::CalibrationManagementWidget(std::shared_ptr<SideBarWidget> sideBarWidget, QWidget* parent) : CommonWindowWidget( WIDGET_TYPE_3D, "", "Calibration Management", 0, Ui::UI_WINDOW_FLAG_CLOSABLE, sideBarWidget, parent) {
  _currentMessage = 0;
  _selectedCalibrationType = CALIBRATION_TYPE_UNKNOWN;
  _messageEventLoop = new QEventLoop(this);
  _updateTimer = new QTimer();
  setupUi();
}

CalibrationManagementWidget::~CalibrationManagementWidget() {
  delete _messageEventLoop;
  _messageEventLoop = 0;
  delete _updateTimer;
  _updateTimer = 0;
}
...
...
CommonWindowWidget::CommonWindowWidget(WidgetType widgetType, const QString& headerTitle, const string& pageName, unsigned int view, unsigned int uiWindowFlags, std::shared_ptr<SideBarWidget> sideBarWidget, QWidget* parent, VisualisationType visuType) : CommonStackedWidget(widgetType, pageName, view, parent, visuType) {
  _windowFlags = uiWindowFlags;
  _sideBarWidget = std::move(sideBarWidget);

  setupUi();

  _ui.headerWidget->headerLabel()->setText( headerTitle );

  connect( _ui.headerWidget, SIGNAL(headerDoubleClicked()), this, SLOT(changeFoldState()));
  connect( _ui.headerWidget, SIGNAL(changeFoldStateClicked()), this, SLOT(changeFoldState()));
  connect( _ui.headerWidget, SIGNAL(closeClicked()), this, SLOT(navigateToHome()));
}

CommonWindowWidget::~CommonWindowWidget() {

}
...
。。。
CommonWindowWidget::CommonWindowWidget(WidgetType WidgetType、常量QString和headerTitle、常量字符串和pageName、无符号整数视图、无符号整数uiWindowFlags、std::shared_ptr sideBarWidget、QWidget*父、VisualizationType VisualType):CommonStackedWidget(WidgetType、pageName、视图、父、VisualType){
_windowFlags=uiWindowFlags;
_sideBarWidget=std::move(sideBarWidget);
setupUi();
_ui.headerWidget->headerLabel()->setText(headerTitle);
连接(_ui.headerWidget,信号(headerDoubleClicked()),此,插槽(changeFoldState());
连接(_ui.headerWidget,信号(changeFoldStateClicked()),此,插槽(changeFoldState());
连接(_ui.headerWidget,信号(closeClicked()),此,插槽(navigateToHome());
}
CommonWindowWidget::~CommonWindowWidget(){
}
...

转发时,0会导致参数推断为
int
,该参数不再可转换为指针

只有文本0可以表示指针,但在传递到
make_shared
后,该文本成为
int
值0,这会导致错误,因为构造函数需要一个指针

改用
nullptr

_widgets.calibrationManagementWidget =
   std::make_shared<CalibrationManagementWidget>(
     _widgets.sideBarWidgetLeft, nullptr
   );
\u widgets.calibrationManagementWidget=
std::使共享(
_widgets.sideBarWidgetLeft,nullptr
);
这是引入
nullptr
的主要原因


说明:,大约28:00分。

请向我们展示CalibrationManagementWidget的构造函数(应该使用共享指针的构造函数),因为
CalibrationManagementWidget
显然是某种类型的,
something.CalibrationManagementWidget=whatever
something.int=whatever
一样有意义。不管你想做什么,它都不会起作用。@SamVarshavchik,它是
什么东西。calibrationManagementWidget
(小写c),所以这可能是一个与类名称几乎相同的字段。谢谢你的输入!我知道这种行为,但使用*p=0似乎仍然有效,不管怎样,我已经用“nullptr”替换了所有出现的情况,只有一大堆类。当然,
*p=0
有效,因为编译器知道0必须被视为指针类型的0值。但是,如果转发0,编译器必须推断类型。类型将被推断为int,这不是构造函数参数的正确类型。因此,您会得到一个错误。