【问题标题】:C++ inherit template classC++继承模板类
【发布时间】:2014-05-18 18:50:33
【问题描述】:

我有一个特殊的要求,希望它不会太牵强并且可以完成。

我有一个模板类

    template<class T> class Packable
    {
    public:
        // Packs a <class T> into a Packet (Packet << T)
        virtual sf::Packet& operator <<(sf::Packet& p) const = 0;
        friend sf::Packet& operator <<(sf::Packet& p, const T &t);
        friend sf::Packet& operator <<(sf::Packet& p, const T *t);


        // Packs a Packet into a <class T> (T << Packet)
        virtual T operator <<(sf::Packet& p) const = 0;
        friend T& operator <<(T &t, sf::Packet& p);
        friend T* operator <<(T *t, sf::Packet& p);

        // Unpacks a Packet into a <class T> (Packet >> T)
        virtual sf::Packet& operator >>(sf::Packet& p) const = 0;
        friend sf::Packet& operator >>(sf::Packet& p, T &);
        friend sf::Packet& operator >>(sf::Packet& p, T* t);
    };

我希望能够使用类似的东西

class Player : public Packable
{
    //...
}

这样,Player 现在已经为它重载了所有这些运算符。

截至目前,我收到 Expected class name 作为编译错误。有没有办法在不需要指定类的情况下做到这一点?也就是说; Packable 继承了Player 怎么能接&lt;class T&gt; 呢?

【问题讨论】:

  • 必须指定Player 两次是很常见的。避免这样做的唯一方法(同时使用相同的设计)是使用预处理器,这将是可怕的。

标签: c++ templates inheritance virtual-functions


【解决方案1】:

我猜你想要类似下面的东西:

class Player: public Packable<Player>
    //...

【讨论】:

  • 这行得通!谢谢@Appleshell。太糟糕了,它不能更干净,但是,这是 C++ :)
  • 我没有忘记别担心!如果我有后续问题或其他信息(命名空间),我应该提出一个新问题还是修改这个问题?
  • @Volte 意见不同 ([1][2][3]),但我想说为后续问题创建一个新问题是件好事。
【解决方案2】:

是的,你需要这样做

template <typename T>
class Player: public Packable<T>
{
...
}

【讨论】:

    猜你喜欢
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多