假设我有这个课:
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
某种方式获得定义吗?
编辑
在之后的评论:
我认为您能获得的最好的就是以下几方面的东西:
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] 删除。
我来说两句