Der Versuch, ein std::shared_ptr
eines Objekts zu erzeugen, das einen std::shared_ptr
als Parameter annimmt, führte zu einem "kein übereinstimmender Konstruktor für die Initialisierung des 'Objekt'" Kompilierungsfehlers.Erstellen eines gemeinsamen Zeigers eines Objekts, das einen gemeinsamen Zeiger als Parameter verwendet
Mein Code sieht wie folgt:
// 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();
Während "Pointer Test" ganz gut kompiliert, die Linien unter "Sidebar Left" genannt Fehler erstellen. Gibt es etwas, das ich falsch mache, oder ist das überhaupt nicht möglich?
Hier ist (einer) die Fehlermeldung (e):
/usr/include/c++/5.4.0/ext/new_allocator.h:120: Error: no matching constructor for initialization of 'CalibrationManagementWidget'
{ ::new((void *)__p) _Up(std::forward<_Args>(__args)...); }
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
EDIT:
Wie gewünscht Ich werde ein paar Schnipsel posten, die auch den Konstruktor des CalibrationWidget enthalten.
calibrationwidget.h
...
Q_INVOKABLE CalibrationManagementWidget(QWidget* parent = 0 , VisualisationType visuType = VISUALISATION_TYPE_TRANSLATOR);
CalibrationManagementWidget(std::shared_ptr<SideBarWidget> sideBarWidget, QWidget* parent = 0);
virtual ~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;
}
...
Hier sind auch aus der CommonWindowWidget Schnipsel.
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.cpp
...
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() {
}
...
Bitte zeigen Sie uns den Konstruktor von CalibrationManagementWidget (der, der Shared Pointer verwenden sollte) – SingerOfTheFall
Da 'CalibrationManagementWidget' offensichtlich eine Art von Art ist, macht' something.CalibrationManagementWidget = was auch immer' so viel Sinn wie 'something.int = was auch immer '. Was auch immer Sie versuchen, es wird nicht funktionieren. –
@SamVarshavchik, es ist 'something.calibrationManagementWidget' (Kleinbuchstabe c), also ist das wahrscheinlich ein Feld namens fast das gleiche wie die Klasse. – SingerOfTheFall