2016-12-20 5 views
3

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() { 

} 
... 
+0

Bitte zeigen Sie uns den Konstruktor von CalibrationManagementWidget (der, der Shared Pointer verwenden sollte) – SingerOfTheFall

+0

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. –

+0

@SamVarshavchik, es ist 'something.calibrationManagementWidget' (Kleinbuchstabe c), also ist das wahrscheinlich ein Feld namens fast das gleiche wie die Klasse. – SingerOfTheFall

Antwort

5

Wenn weitergeleitet, 0 bewirkt, dass der Parameter als int abgeleitet werden, die nicht mehr umwandelbar in einen Zeiger ist.

Nur die literal 0 einen Zeiger darstellen kann, aber nach an make_shared geleitet wurde, wird das Literal des int Wert 0, was den Fehler verursacht, wie der Konstruktor einen Zeiger erwartet.

Verwenden nullptr statt:

_widgets.calibrationManagementWidget = 
    std::make_shared<CalibrationManagementWidget>(
    _widgets.sideBarWidgetLeft, nullptr 
    ); 

Dies ist der Hauptgrund, warum nullptr eingeführt wurde.

Erklärung: https://channel9.msdn.com/Shows/Going+Deep/Stephan-T-Lavavej-Everything-you-ever-wanted-to-know-about-nullptr, ungefähr Minute 28:00.

+0

Vielen Dank für diesen Beitrag! Ich weiß von diesem Verhalten, aber es scheint, dass es immer noch funktioniert, um * p = 0 zu verwenden, jedenfalls ersetze ich alle diese Fälle bereits mit "nullptr", es gibt nur eine Unmenge von Klassen. – Migsi

+0

Natürlich funktioniert '* p = 0', da der Compiler weiß, dass 0 als 0-Wert des Zeigertyps behandelt werden muss.Wenn Sie jedoch * 0 * weiterleiten, muss der Compiler * den Typ * ableiten. Der Typ wird als int abgeleitet, was nicht der richtige Typ für das Konstruktorargument ist. Dadurch erhalten Sie einen Fehler. – JohnB

Verwandte Themen