2016-12-20 12 views
3

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

を「ポインタのテストは」うまくコンパイルしますが、「サイドバー左」の下の行は、名前のエラーを作成します。私が間違ってインスタンス化していることがあるのですか?これは一般的に可能ではありませんか?私もCalibrationWidgetのコンストラクタが含まれているいくつかのスニペットを投稿します要求したよう

/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)...); } 
          ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

編集:ここでは

はエラーメッセージ(複数可)(の1つ)です。ここで

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; 
} 
... 

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

CalibrationManagementWidget(共有ポインタを取るべきもの)のコンストラクタを表示してください – SingerOfTheFall

+0

'CalibrationManagementWidget'は明らかに何らかの種類なので、' something.CalibrationManagementWidget = whatever'は 'something.int = whatever '。あなたがしようとしていることは何でも、動作しません。 –

+0

@SamVarshavchik、それは 'something.calibrationManagementWidget'(小文字のc)なので、おそらくクラスと同じ名前のフィールドです。 – SingerOfTheFall

答えて

5

転送され、0はもうポインタに変換ないintとして推定されるべきパラメータを引き起こします。

のみリテラル 0ポインタを表すことができるが、make_sharedに渡された後、リテラルは、コンストラクタがポインタを受け取るように、エラーが発生しint値0となります。

使用nullptr代わり:

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

これはnullptrが導入された主な理由です。

説明:https://channel9.msdn.com/Shows/Going+Deep/Stephan-T-Lavavej-Everything-you-ever-wanted-to-know-about-nullptr、約28:00。

+0

ありがとうございました!私はこの動作について知っていますが、まだ* p = 0を使用するように見えますが、とにかくこれらのすべての事象を "nullptr"で置き換えています。 – Migsi

+0

もちろん、 '* p = 0'は、0がポインタ型の0の値として扱われなければならないことをコンパイラが知っているので、機能します。ただし、* forward * 0の場合、コンパイラはその型を推論する必要があります。型はintであると推定されますが、これはコンストラクタ引数に正しい型ではありません。したがって、エラーが発生します。 – JohnB

関連する問題