Moh*_* El 2 c++ templates vector crtp c++11
在寻找在容器中存储 CRTP 对象的方法时,我发现了以下问题:
\n\n\n\n我尝试了标记的解决方案
\n\n\n\n但编译器抱怨错误如下:
\n\nno 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提前致谢
\nBase
应该是 的公共继承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)
您缺少 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应该接受的答案。