0

我正在尝试在Wt中开发一个应用程序,即使用 Dbo 模块和在 aQueryModel中显示的 a WTableView

然而,当我尝试这样做时,

dbo::QueryModel< dbo::ptr<medical_staff> > *model = new dbo::QueryModel< dbo::ptr<medical_staff> >();
model->setQuery(session_.find<medical_staff>());
model->addAllFieldsAsColumns();
Wt::WTableView *view = new Wt::WTableView();    
view->setModel(model);

理论上(我在网上某处发现了类似的片段)这很好,但我的编译器不同意:

/home/phil/projects/TN-wt/src/view/StaffView.cxx:84:20: error: cannot convert ‘Wt::Dbo::QueryModel<Wt::Dbo::ptr<medical_staff> >*’ to ‘const std::shared_ptr<Wt::WAbstractItemModel>&’
   84 |     view->setModel(model);
      |                    ^~~~~
      |                    |
      |                    Wt::Dbo::QueryModel<Wt::Dbo::ptr<medical_staff> >*

对我来说,这个错误看起来和阁楼希腊语差不多,有人能告诉我发生了什么吗?不幸的是,没有 Dbo::QueryModel 的文档。

此外,Wt 工具包是否太旧而无法使用、无法维护?我现在应该放弃使用它吗?

编辑:我尝试了所有类型的 std::make_shared(model) 铸造,这似乎是有意义的,但后来我得到了更多的阁楼希腊语:

/home/phil/projects/TN-wt/src/view/StaffView.cxx:82:27: error: no matching function for call to ‘make_shared(Wt::Dbo::QueryModel<Wt::Dbo::ptr<medical_staff> >*&)’
   82 |     std::make_shared(model);
      |                           ^
In file included from /usr/include/c++/9/memory:81,
                 from /usr/include/Wt/Core/observable.hpp:12,
                 from /usr/include/Wt/Core/observing_ptr_impl.hpp:10,
                 from /usr/include/Wt/Core/observing_ptr.hpp:136,
                 from /usr/include/Wt/WGlobal.h:11,
                 from /usr/include/Wt/WObject.h:11,
                 from /usr/include/Wt/WWidget.h:10,
                 from /usr/include/Wt/WCompositeWidget.h:10,
                 from /home/phil/projects/TN-wt/src/view/StaffView.h:3,
                 from /home/phil/projects/TN-wt/src/view/StaffView.cxx:1:
/usr/include/c++/9/bits/shared_ptr.h:714:5: note: candidate: ‘template<class _Tp, class ... _Args> std::shared_ptr<_Tp> std::make_shared(_Args&& ...)’
  714 |     make_shared(_Args&&... __args)
      |     ^~~~~~~~~~~
/usr/include/c++/9/bits/shared_ptr.h:714:5: note:   template argument deduction/substitution failed:
/home/phil/projects/TN-wt/src/view/StaffView.cxx:82:27: note:   couldn’t deduce template parameter ‘_Tp’
   82 |     std::make_shared(model);
      |                           ^
4

1 回答 1

1

您似乎对std::shared_ptr(或根本没有智能指针)没有太多经验。阅读智能指针的介绍可能会很有用。

基本上,存在两种构造共享指针的方法:

  1. std::shared_ptr构造函数:为提供的原始指针构造一个新的共享指针。

    dbo::QueryModel< dbo::ptr<medical_staff> > *model = new dbo::QueryModel< dbo::ptr<medical_staff> >();
    std::shared_ptr<dbo::QueryModel< dbo::ptr<medical_staff> > > sharedModel = std::shared_ptr(model)
    
  2. std::make_shared<T>: 构造一个新的类型对象T并将其包装在一个std::shared_ptr

    std::shared_ptr<dbo::QueryModel< dbo::ptr<medical_staff> > > sharedModel = std::make_shared<dbo::QueryModel< dbo::ptr<medical_staff> > >();
    

方法二更短,因此在大多数情况下是首选选项,尽管有一些例外:我什么时候想从原始指针构造一个共享指针

于 2020-06-28T19:25:05.707 回答