C++ 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

我想使用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 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;
};