CRTP 共享指针的 C++ 向量
C++ vector of CRTP shared pointers
在寻找在容器中存储 CRTP 对象的方法时,我发现了以下问题:
A polymorphic collection of Curiously Recurring Template Pattern (CRTP) in C++?
我尝试了标记的解决方案
但是编译器抱怨如下错误:
no known conversion for argument 1 from ‘std::shared_ptr<DerivedA>’ to ‘const std::shared_ptr<BaseInterface>&’
这是我的尝试:
#include <vector>
#include <memory>
struct BaseInterface {
virtual ~BaseInterface() {}
virtual double interface() = 0;
};
template <typename Derived>
class Base : BaseInterface {
public:
double interface(){
return static_cast<Derived*>(this)->implementation();
}
};
class DerivedA : public Base<DerivedA>{
public:
double implementation(){ return 2.0;}
};
class DerivedB : public Base<DerivedB>{
public:
double implementation(){ return 1.0;}
};
int main() {
std::vector<std::shared_ptr<BaseInterface>> ar;
ar.emplace_back(std::make_shared<DerivedA>());
return 0;
}
您知道如何修复编译器错误,或者如何更好地解决问题吗?
提前致谢
您缺少 return 声明 和 Base
应该公开地继承自 BaseInterface
。
template <typename Derived>
struct Base : BaseInterface
{
double interface() {
return static_cast<Derived*>(this)->implementation();
}
};
但要注意 <-- 另一个 OP 应该接受的答案。
Base
应该是 BaseInterface
的 public 继承(你也忘记了 return
)。
然后 ar.emplace_back(std::make_shared<DerivedA>());
效果很好:
template <typename Derived>
class Base : public BaseInterface {
public:
double interface(){
return static_cast<Derived*>(this)->implementation();
}
};
在寻找在容器中存储 CRTP 对象的方法时,我发现了以下问题:
A polymorphic collection of Curiously Recurring Template Pattern (CRTP) in C++?
我尝试了标记的解决方案
但是编译器抱怨如下错误:
no known conversion for argument 1 from ‘std::shared_ptr<DerivedA>’ to ‘const std::shared_ptr<BaseInterface>&’
这是我的尝试:
#include <vector>
#include <memory>
struct BaseInterface {
virtual ~BaseInterface() {}
virtual double interface() = 0;
};
template <typename Derived>
class Base : BaseInterface {
public:
double interface(){
return static_cast<Derived*>(this)->implementation();
}
};
class DerivedA : public Base<DerivedA>{
public:
double implementation(){ return 2.0;}
};
class DerivedB : public Base<DerivedB>{
public:
double implementation(){ return 1.0;}
};
int main() {
std::vector<std::shared_ptr<BaseInterface>> ar;
ar.emplace_back(std::make_shared<DerivedA>());
return 0;
}
您知道如何修复编译器错误,或者如何更好地解决问题吗? 提前致谢
您缺少 return 声明 和 Base
应该公开地继承自 BaseInterface
。
template <typename Derived>
struct Base : BaseInterface
{
double interface() {
return static_cast<Derived*>(this)->implementation();
}
};
但要注意 <-- 另一个 OP 应该接受的答案。
Base
应该是 BaseInterface
的 public 继承(你也忘记了 return
)。
然后 ar.emplace_back(std::make_shared<DerivedA>());
效果很好:
template <typename Derived>
class Base : public BaseInterface {
public:
double interface(){
return static_cast<Derived*>(this)->implementation();
}
};