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