假设我有这个课:

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

我想使用以下typedef和方法扩充我的类(class):
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;
    // ...
}

因为它为不同的T定义了A<T>::Color,而不是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定义吗?

最佳答案

编辑

comment之后:

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

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)函数成为非模板。

关于c++ - 如何在模板化类的 'namespace'中制作非模板化的typedef?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31470629/

10-11 23:05
查看更多