我正在写一个"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;
};
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>
由于Effect
是一个模板类,并且您没有在EffectMgr
中专门化它,因此它也需要是一个模版:
template<typename T>
class EffectMgr : public Singleton <EffectMgr>
{
private:
typedef std::map<std::string, Effect<T> & > EffectMap;
};
据我所知,您希望在映射中存储具有不同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
上编写一个包装器来消除指针。