CRTP 共享指针的 C++ 向量

Moh*_* El 2 c++ templates vector crtp c++11

在寻找在容器中存储 CRTP 对象的方法时,我发现了以下问题:

\n\n

C++ 中奇怪的重复模板模式 (CRTP) 的多态集合?

\n\n

我尝试了标记的解决方案

\n\n

/sf/answers/1735665921/

\n\n

但编译器抱怨错误如下:

\n\n
no known conversion for argument 1 from \xe2\x80\x98std::shared_ptr<DerivedA>\xe2\x80\x99 to \xe2\x80\x98const std::shared_ptr<BaseInterface>&\xe2\x80\x99\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是我的尝试:

\n\n
#include <vector>\n#include <memory>\n\nstruct BaseInterface {\n    virtual ~BaseInterface() {}\n    virtual double interface() = 0;\n};\n\ntemplate <typename Derived>\nclass Base : BaseInterface {\npublic:\n    double interface(){\n        return static_cast<Derived*>(this)->implementation();\n}\n};\n\nclass DerivedA : public Base<DerivedA>{\npublic:\n     double implementation(){ return 2.0;}\n};\n\nclass DerivedB : public Base<DerivedB>{\npublic:\n     double implementation(){ return 1.0;}\n};\n\n\nint main() {\n    std::vector<std::shared_ptr<BaseInterface>> ar;\n    ar.emplace_back(std::make_shared<DerivedA>());\nreturn 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

您知道如何修复编译器错误,或者如何更好地解决问题吗?\n提前致谢

\n

Hir*_*oki 6

Base应该是 的公共继承BaseInterface(你也忘记了return)。那么ar.emplace_back(std::make_shared<DerivedA>());效果很好:

演示版

template <typename Derived>
class Base : public BaseInterface {
public:
    double interface(){
        return static_cast<Derived*>(this)->implementation();
    }
};
Run Code Online (Sandbox Code Playgroud)


YSC*_*YSC 5

您缺少 return 声明 应该从publicBase继承。BaseInterface

template <typename Derived>
struct Base : BaseInterface
{
    double interface() {
        return static_cast<Derived*>(this)->implementation();
    }
};
Run Code Online (Sandbox Code Playgroud)

现场演示

但要注意/sf/answers/1735654161/ <--其他OP应该接受的答案。