我写了一个“效果”类(对于一个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;
};
答案 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
上编写一个包装来摆脱指针。