容器类中的模板类型



我正在写一个"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上编写一个包装器来消除指针。

最新更新