C++ CRTP如何使派生类具有基类的容器
我想使用CRTP模拟以下行为:C++ CRTP如何使派生类具有基类的容器,c++,template-meta-programming,crtp,C++,Template Meta Programming,Crtp,我想使用CRTP模拟以下行为: #include <vector> #include <memory> class GameNumber { public: ~GameNumber(){} }; class GameNumber_real : public GameNumber { public: GameNumber_real (float m) {n = m;} ~GameNumber_real(){} private: float
#include <vector>
#include <memory>
class GameNumber {
public:
~GameNumber(){}
};
class GameNumber_real : public GameNumber {
public:
GameNumber_real (float m) {n = m;}
~GameNumber_real(){}
private:
float n;
};
class GameNumber_sets : public GameNumber {
public:
GameNumber_sets (float n, float m) {
left.push_back (std::make_shared<GameNumber_real>
(GameNumber_real(n)));
right.push_back (std::make_shared<GameNumber_real>
(GameNumber_real(m)));
}
~GameNumber_sets(){}
private:
std::vector <std::shared_ptr<GameNumber>> left;
std::vector <std::shared_ptr<GameNumber>> right;
};
#包括
#包括
类游戏号{
公众:
~GameNumber(){}
};
类别GameNumber\u real:公共GameNumber{
公众:
GameNumber_实(浮点m){n=m;}
~GameNumber_real(){}
私人:
浮动n;
};
类别GameNumber_集合:公共GameNumber{
公众:
游戏编号\u集(浮点n,浮点m){
left.push_back(标准::使_共享
(GameNumber_real(n));;
右。向后推(标准::使共享)
(GameNumber_real)(m);;
}
~GameNumber_集(){}
私人:
std::向量左;
向量权;
};
我的尝试是:
template <class T>
class GameNumber {}
class GameNumber_real : public GameNumber<GameNumber_real> {
public:
GameNumber_real (float m) {n = m;}
private:
float n;
};
class GameNumber_sets : public GameNumber<GameNumber_sets> {
public:
GameNumber_sets (float n, float m) {
left.push_back (std::make_shared<GameNumber_real>
(GameNumber_real(n)));
right.push_back (std::make_shared<GameNumber_real>
(GameNumber_real(m)));
}
private:
std::vector <std::shared_ptr<GameNumber>> left;
std::vector <std::shared_ptr<GameNumber>> right;
};
模板
类游戏号{}
类别GameNumber\u real:公共GameNumber{
公众:
GameNumber_实(浮点m){n=m;}
私人:
浮动n;
};
类别GameNumber_集合:公共GameNumber{
公众:
游戏编号\u集(浮点n,浮点m){
left.push_back(标准::使_共享
(GameNumber_real(n));;
右。向后推(标准::使共享)
(GameNumber_real)(m);;
}
私人:
std::向量左;
向量权;
};
编译器错误为:
include/game_number.hpp:44:33: error: no matching function for call to
‘std::vector<std::shared_ptr<GameNumber<GameNumber_sets>>>
::push_back(std::shared_ptr<GameNumber_real>)’
(GameNumber_real(n)));
include/game\u number.hpp:44:33:错误:没有用于调用的匹配函数
'std::vector
::推回(标准::共享)
(GameNumber_real(n));;
从消息中我了解到,在GameNumber\u集合中,GameNumber解析为GameNumber\u GameNumber\u集合。如果您能告诉我如何实现我期望的行为,我将非常高兴。您可以明确指定模板参数,如
GameNumber
,它将解决您的问题
您还可以将构造函数参数直接传递给std::make_shared
改进代码:
template <class T>
class GameNumber {};
class GameNumber_real : public GameNumber<GameNumber_real> {
public:
GameNumber_real (float m) {n = m;}
private:
float n;
};
class GameNumber_sets : public GameNumber<GameNumber_sets> {
public:
GameNumber_sets (float n, float m) {
left.push_back (std::make_shared<GameNumber_real>(n));
right.push_back (std::make_shared<GameNumber_real>(m));
}
private:
std::vector <std::shared_ptr<GameNumber<GameNumber_real>>> left;
std::vector <std::shared_ptr<GameNumber<GameNumber_real>>> right;
};
这个不行。。。我希望向量是GameNumber\u real和GameNumber\u集合。在前一个摘录中,它是有效的。我不需要CRTP,但我想that@MTLaurentys
std::任何
都可能有帮助,请查看编辑
template <class T>
class GameNumber {};
class GameNumber_real : public GameNumber<GameNumber_real> {
public:
GameNumber_real (float m) {n = m;}
private:
float n;
};
class GameNumber_sets : public GameNumber<GameNumber_sets> {
public:
GameNumber_sets (float n, float m) {
left.push_back (std::make_shared<std::any>
(GameNumber_real(n)));
right.push_back (std::make_shared<std::any>
(GameNumber_real(m)));
}
private:
std::vector <std::shared_ptr<std::any>> left;
std::vector <std::shared_ptr<std::any>> right;
};