如何在模板化类的“命名空间”中创建非模板化typedef?

刺柏

假设我有这个课:

template <typename T> class A {
    T datum;
    void foo();
}

我想使用以下typedef和方法扩充我的课程:

typedef enum {Red, Green, Blue} Color;
bar(Color color) { baz(datum,color); };

问题是,我希望Color仅在类中定义,而不是模板化,即我希望能够做到:

A<int> a;
a.bar(A::Red);

现在,我无法执行此操作:

template <typename T> class A {
    typedef enum {Red, Green, Blue} Color;
    // ...
}

因为它定义A<T>::Color了不同的T,所以不是A::Color还有这个:

namespace A {
    typedef enum {Red, Green, Blue} Color;
}
template <typename T> class A { /* ... */ }

似乎没有编译。这也没有:

typedef enum {Red, Green, Blue} A::Color;
template <typename A> class A { /* ... */ }

因此,我可以通过A::Color某种方式获得定义吗?

保罗·M

编辑

在之后的评论

我认为您能获得的最好的就是以下几方面的东西:

template<typename T = void> class A;

template<> class A<void>{
public:
    enum Color { Red };
};

template <typename T> class A : public A<>{
      T datum;
public:
      void foo(){}
      void bar(Color c){}
};

int main()
{
     A<int> a;
     a.bar(A<>::Red);
}

这有点棘手,但是它所做的只是定义一个基数class A<void>,您也可以调用它class A<>,其中仅包含enum然后,使所有其他模板特殊化都从此类继承。

我认为这是与您要查找的内容最接近的匹配,即,类范围非模板enum


原始答案

恐怕您必须定义一个非模板基类,其中包含的定义enum,然后让您的模板类从该基类继承。

class A_base{
public:
    typedef enum {Red, Green, Blue} Color;
    void bar(Color color){}
};

template <typename T> class A : public A_base{
     T datum;
     void foo(){}
};

int main()
{
    A<int> a;
    a.bar(A_base::Red);
}

不会enum引入一个名为的范围A但这会使枚举,更重要的是使函数成为void bar(Color color)非模板的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在模板化类中为``boost :: array_view''创建typedef

来自分类Dev

如何在模板化类中为``boost :: array_view''创建typedef

来自分类Dev

您如何专门化非模板化类中没有参数的模板化方法?

来自分类Dev

“命名”模板类实例化

来自分类Dev

Typedef 在模板化类中使用模板化嵌套类

来自分类Dev

类内部的模板化类的Typedef

来自分类Dev

类内的模板化类的Typedef

来自分类Dev

如何在C ++中对完整的类进行模板化

来自分类Dev

如何在模板类中实例化T类型

来自分类Dev

模板化类中的typedef导致C ++错误

来自分类Dev

您如何专门化非模板类中没有参数的模板方法?

来自分类Dev

如何在捕获lambda参数时使用模板化的typedef?

来自分类Dev

如何在 STL 容器中存储具有抽象模板类型的抽象模板化类?

来自分类Dev

C ++:调用模板化类的非模板化函数

来自分类Dev

如何在Vue中模板化消息?

来自分类Dev

未命名的命名空间,模板化函数和多个包含

来自分类Dev

Qt中的模板化类

来自分类Dev

具有非模板化类的C ++类模板?

来自分类Dev

具有名称空间的模板化结构的Typedef

来自分类Dev

如何引用模板类中定义的typedef

来自分类Dev

非模板类中的模板化朋友类,其中朋友也使用该类

来自分类Dev

非模板类中的模板化朋友类,其中朋友也使用该类

来自分类Dev

如何在构造函数中为不同的类使用模板化的类

来自分类Dev

如何使用模板模板参数专门化类模板?

来自分类Dev

非模板类方法的条件模板专门化

来自分类Dev

访问模板化类的非模板基的静态数据

来自分类Dev

模板类的非模板朋友是否被实例化?

来自分类Dev

在模板化类之外定义非模板函数

来自分类Dev

如何在类C ++中使用模板化结构

Related 相关文章

  1. 1

    如何在模板化类中为``boost :: array_view''创建typedef

  2. 2

    如何在模板化类中为``boost :: array_view''创建typedef

  3. 3

    您如何专门化非模板化类中没有参数的模板化方法?

  4. 4

    “命名”模板类实例化

  5. 5

    Typedef 在模板化类中使用模板化嵌套类

  6. 6

    类内部的模板化类的Typedef

  7. 7

    类内的模板化类的Typedef

  8. 8

    如何在C ++中对完整的类进行模板化

  9. 9

    如何在模板类中实例化T类型

  10. 10

    模板化类中的typedef导致C ++错误

  11. 11

    您如何专门化非模板类中没有参数的模板方法?

  12. 12

    如何在捕获lambda参数时使用模板化的typedef?

  13. 13

    如何在 STL 容器中存储具有抽象模板类型的抽象模板化类?

  14. 14

    C ++:调用模板化类的非模板化函数

  15. 15

    如何在Vue中模板化消息?

  16. 16

    未命名的命名空间,模板化函数和多个包含

  17. 17

    Qt中的模板化类

  18. 18

    具有非模板化类的C ++类模板?

  19. 19

    具有名称空间的模板化结构的Typedef

  20. 20

    如何引用模板类中定义的typedef

  21. 21

    非模板类中的模板化朋友类,其中朋友也使用该类

  22. 22

    非模板类中的模板化朋友类,其中朋友也使用该类

  23. 23

    如何在构造函数中为不同的类使用模板化的类

  24. 24

    如何使用模板模板参数专门化类模板?

  25. 25

    非模板类方法的条件模板专门化

  26. 26

    访问模板化类的非模板基的静态数据

  27. 27

    模板类的非模板朋友是否被实例化?

  28. 28

    在模板化类之外定义非模板函数

  29. 29

    如何在类C ++中使用模板化结构

热门标签

归档