容器类中的模板类型

发布于 2025-01-03 05:12:13 字数 699 浏览 0 评论 0原文

我编写了一个“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;
};

我在容器类中遇到的错误是 T 未定义。有人可以启发我吗?

我可能(纯粹是偶然和修补)找到了答案,尽管在编写容器类之前我不会知道:

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

I writing an "Effect" class (for an opengl program) and I'm also attempting to write a container class for.

The Effect class is defined as follows:

template <typename T>
class Effect
{
  private:
  Vbo<T>  m_Vbo;
};

Where T is a type that describes the vertex attributes.

In order to write a container class, I'd like to store these effects in an std::map:

class EffectMgr : public Singleton <EffectMgr>
{
private:
    typedef std::map<std::string, Effect<T> & > EffectMap;
};

The error I get with the container class is that T is undefined. Can someone enlighten me?

I may have (by sheer chance and tinkering) have found the answer although I won't know until I've written the container class:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

愁以何悠 2025-01-10 05:12:13

T 的范围在 Effect 定义内。在范围之外,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>

T is scoped within the Effect definition. Outside of the scope T is undefined.

Perhaps you mean this?

template <typename T>
class EffectMgr : public Singleton <EffectMgr>
{
private:
    typedef std::map<std::string, Effect<T> & > EffectMap;
};
// use: EffectMgr<type>::EffectMap

If you want only the typedef to be templated then do this:

class EffectMgr : public Singleton <EffectMgr>
{
private:
    template <typename T>
    using EffectMap = std::map<std::string, Effect<T> & >; // C++11 feature
};
// use: EffectMgr::EffectMap<type>
深巷少女 2025-01-10 05:12:13

由于 Effect 是一个模板类,并且您没有在 EffectMgr 中对其进行专门化,因此它也需要是一个模板:

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

Since Effect is a template class, and you're not specializing it inside EffectMgr, it also needs to be a template:

template<typename T>
class EffectMgr : public Singleton <EffectMgr>
{
private:
    typedef std::map<std::string, Effect<T> & > EffectMap;
};
虚拟世界 2025-01-10 05:12:13

据我了解,您希望在地图中存储具有不同 T 类型的效果。

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

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

IEffect::~IEffect()
{
}

并在模板中实现它:

template <typename T>
class Effect: public IEffect
{
  private:
  Vbo<T>  m_Vbo;
};

现在,您可以创建 std::map

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

As I understand, you want to store effects with a different T-ypes in a map.

If it is, the simplest way would be specify interface

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

IEffect::~IEffect()
{
}

and implement it in your template:

template <typename T>
class Effect: public IEffect
{
  private:
  Vbo<T>  m_Vbo;
};

now, you can create std::map<std::string, IEffect* >

With additional effort, you can write a wrapper over IEffect to get rid of pointers.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文