У меня есть своеобразная просьба, надеюсь, она не слишком надуманная и может быть выполнена.
У меня есть класс шаблона
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>
, когда я его унаследую?
Player
дважды. Единственный способ избежать этого (при использовании того же дизайна) — использовать препроцессор, что было бы отвратительно. - person Mankarse   schedule 18.05.2014