типы шаблонов в классе контейнера - PullRequest
0 голосов
/ 05 февраля 2012

Я пишу класс "Effect" (для программы opengl), а также пытаюсь написать контейнерный класс для.

Класс Эффекта определяется следующим образом:

template <typename T>
class Effect
{
  private:
  Vbo<T>  m_Vbo;
};

Где T - это тип, который описывает атрибуты вершины.

Чтобы написать контейнерный класс, я хотел бы сохранить эти эффекты в std :: map:

class EffectMgr : public Singleton <EffectMgr>
{
private:
    typedef std::map<std::string, Effect<T> & > EffectMap;
};

Ошибка, которую я получаю с контейнерным классом, состоит в том, что T не определено. Может ли кто-нибудь просветить меня?

Возможно, я (по чистой случайности и ковырению) нашел ответ, хотя не узнаю, пока не напишу класс контейнера:

class EffectMgr : public Singleton <EffectMgr>,
{
private:
    template <typename T> 
    typedef std::map<std::string, Effect<T> & > EffectMap;
};

Ответы [ 3 ]

0 голосов
/ 05 февраля 2012

T находится в пределах определения эффекта.Вне области действия T не определено.

Возможно, вы имеете в виду это?

template <typename T>
class EffectMgr : public Singleton <EffectMgr>
{
private:
    typedef std::map<std::string, Effect<T> & > EffectMap;
};
// use: EffectMgr<type>::EffectMap

Если вы хотите, чтобы только typedef был шаблонизирован, то сделайте следующее:

class EffectMgr : public Singleton <EffectMgr>
{
private:
    template <typename T>
    using EffectMap = std::map<std::string, Effect<T> & >; // C++11 feature
};
// use: EffectMgr::EffectMap<type>
0 голосов
/ 05 февраля 2012

Как я понимаю, вы хотите хранить эффекты с другими T -типами на карте.

Если это так, самый простой способ - указать интерфейс

class IEffect
{
public:
   virtual ~IEffect() = 0;
}

IEffect::~IEffect()
{
}

и внедрите его в свой шаблон:

template <typename T>
class Effect: public IEffect
{
  private:
  Vbo<T>  m_Vbo;
};

Теперь вы можете создать std::map<std::string, IEffect* >

С дополнительными усилиями вы можете написать оболочку над IEffect, чтобы избавиться от указателей.

0 голосов
/ 05 февраля 2012

Поскольку Effect является классом шаблона, и вы не специализируете его внутри EffectMgr, он также должен быть шаблоном:

template<typename T>
class EffectMgr : public Singleton <EffectMgr>
{
private:
    typedef std::map<std::string, Effect<T> & > EffectMap;
};
...