我正在编写一个"Effect“类(用于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;
};关于container类我得到的错误是T是未定义的。有没有人能开导我?
我可能已经找到了答案(完全是偶然的),尽管我只有在写完容器类后才能知道:
class EffectMgr : public Singleton <EffectMgr>,
{
private:
template <typename T>
typedef std::map<std::string, Effect<T> & > EffectMap;
};发布于 2012-02-05 22:52:56
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>发布于 2012-02-05 22:52:01
由于Effect是一个模板类,并且您没有在EffectMgr中对其进行专门化,因此它也需要是一个模板:
template<typename T>
class EffectMgr : public Singleton <EffectMgr>
{
private:
typedef std::map<std::string, Effect<T> & > EffectMap;
};发布于 2012-02-05 23:03:51
据我所知,您希望在地图中存储具有不同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上编写一个包装器来消除指针。
https://stackoverflow.com/questions/9150139
复制相似问题