C++ наследует класс шаблона

У меня есть своеобразная просьба, надеюсь, она не слишком надуманная и может быть выполнена.

У меня есть класс шаблона

    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 как <class T>, когда я его унаследую?


person Volte    schedule 18.05.2014    source источник
comment
Прочтите о странно повторяющемся шаблоне.   -  person Some programmer dude    schedule 18.05.2014
comment
Очень часто приходится указывать Player дважды. Единственный способ избежать этого (при использовании того же дизайна) — использовать препроцессор, что было бы отвратительно.   -  person Mankarse    schedule 18.05.2014


Ответы (2)


Я думаю, вы хотите что-то вроде следующего:

class Player: public Packable<Player>
    //...
person Appleshell    schedule 18.05.2014
comment
Это работает! Спасибо @Appleshell. Жаль, что это не может быть немного чище, но эй, это C++ :) - person Volte; 18.05.2014
comment
Я не забыл, не волнуйся! Если у меня есть дополнительный вопрос или дополнительная информация (пространства имен), должен ли я создать новый вопрос или изменить этот? - person Volte; 19.05.2014
comment
@Volte Мнения расходятся ([1][2][3]), но я бы сказал, что было бы неплохо создать новый вопрос для дополнительных вопросов. - person Appleshell; 19.05.2014

Да, вам нужно сделать

template <typename T>
class Player: public Packable<T>
{
...
}
person vsoftco    schedule 18.05.2014