C++ 容器类中的模板类型

C++ 容器类中的模板类型,c++,templates,stdmap,C++,Templates,Stdmap,我正在编写一个“Effect”类(用于opengl程序),同时也在尝试为其编写一个容器类 效果类别定义如下: template <typename T> class Effect { private: Vbo<T> m_Vbo; }; 模板 阶级效应 { 私人: Vbo m_Vbo; }; 其中T是描述顶点属性的类型 为了编写容器类,我想将这些效果存储在std::map中: class EffectMgr : public Singleton <Eff

我正在编写一个“Effect”类(用于opengl程序),同时也在尝试为其编写一个容器类

效果类别定义如下:

template <typename T>
class Effect
{
  private:
  Vbo<T>  m_Vbo;
};
模板
阶级效应
{
私人:
Vbo m_Vbo;
};
其中T是描述顶点属性的类型

为了编写容器类,我想将这些效果存储在std::map中:

class EffectMgr : public Singleton <EffectMgr>
{
private:
    typedef std::map<std::string, Effect<T> & > EffectMap;
};
class EffectMgr:public Singleton
{
私人:
typedef std::map EffectMap;
};
容器类的错误是T未定义。有人能启发我吗

我可能(纯属偶然和修修补补)已经找到了答案,但在编写容器类之前我不知道答案:

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

由于
效果
是一个模板类,并且您没有在
效果管理器中专门化它,因此它还需要是一个模板:

template<typename T>
class EffectMgr : public Singleton <EffectMgr>
{
private:
    typedef std::map<std::string, Effect<T> & > EffectMap;
};
template <typename T>
class Effect: public IEffect
{
  private:
  Vbo<T>  m_Vbo;
};
模板
类EffectMgr:公共单例
{
私人:
typedef std::map EffectMap;
};

T
在效果定义范围内。未定义范围之外的
T

也许你是这个意思

template <typename T>
class EffectMgr : public Singleton <EffectMgr>
{
private:
    typedef std::map<std::string, Effect<T> & > EffectMap;
};
// use: EffectMgr<type>::EffectMap
模板
类EffectMgr:公共单例
{
私人:
typedef std::map EffectMap;
};
//用法:EffectMgr::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>
class EffectMgr:public Singleton
{
私人:
模板
使用EffectMap=std::map;//C++11特性
};
//用法:EffectMgr::EffectMap

据我所知,您希望在地图中使用不同的
T
-类型存储效果

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

class IEffect
{
public:
   virtual ~IEffect() = 0;
}

IEffect::~IEffect()
{
}
并在模板中实现它:

template<typename T>
class EffectMgr : public Singleton <EffectMgr>
{
private:
    typedef std::map<std::string, Effect<T> & > EffectMap;
};
template <typename T>
class Effect: public IEffect
{
  private:
  Vbo<T>  m_Vbo;
};
模板
阶级效应:公共效应
{
私人:
Vbo m_Vbo;
};
现在,您可以创建
std::map


通过额外的努力,您可以在
IEffect
上编写一个包装器来摆脱指针。

您的第一个容器代码是typedef,第二个不是?第二个不是,但是,这是VS2010允许的唯一语法,我只是在试验……模板不是类型;它们是模板。将模板视为代码生成工具。您只能使用实际类型编程,这是您实例化模板时得到的。
Foo
Foo
之间没有关系;他们是完全不同的,不相关的类型。一旦我尝试了,我会把答案奖励给你。谢谢你的解释。事实证明这不是我想要的:SInteresting语法。我必须调查一下。感谢。VS2010似乎不喜欢这种语法,突出显示using关键字,帮助显示“Error:expected a