假设我有这个课:
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/