容器类中的模板类型

时间:2012-02-05 14:49:06

标签: c++ templates stdmap

我写了一个“效果”类(对于一个opengl程序),我也试图为它写一个容器类。

Effect类定义如下:

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 :(得分:0)

由于Effect是一个模板类,并且您没有在EffectMgr内对其进行专门化,因此它也需要是一个模板:

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

答案 1 :(得分:0)

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>

答案 2 :(得分:0)

据我了解,您希望在地图中使用不同的T - ypes存储效果。

如果是,最简单的方法是指定接口

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上编写一个包装来摆脱指针。