是否有一种方法可以使用class-private枚举中的值作为其模板化基类的模板值?
这是我想做的一个例子:
template<int NumCats> class CatList
{
public:
CatList() {/* empty */}
private:
int cats[NumCats];
};
class MyCatList : private CatList<NUM_CATS>
{
public:
MyCatList() {/* empty */}
private:
enum {
CAT_TABBY = 0,
CAT_GINGER,
CAT_CALICO,
NUM_CATS
};
};
int main(int, char **)
{
MyCatList myCats;
return 0;
}
...但是上面的内容给了我编译错误:
Jeremys-Mac-Pro:~ jaf$ g++ temp.cpp
temp.cpp:10:38: error: use of undeclared identifier 'NUM_CATS'
class MyCatList : private CatList<NUM_CATS>
^
temp.cpp:11:4: error: expected class name
{
^
2 errors generated.
我知道我可以将枚举移到MyCatList
声明的外部/之前,但这使该枚举公开,并且我希望尽可能将其隐藏为实现细节。
另一个可能的更改是将CatList<NUM_CATS>
设置为私有成员变量而不是从其继承,但是在我的真实代码中,它具有一些我想在子类中覆盖的虚拟方法,因此不会。在这种情况下不能为我工作。
答案 0 :(得分:1)
您可以将枚举声明为帮助程序类的私有成员,并与该类的朋友MyCatList
一起声明。将该帮助程序类添加为私有基础(以将枚举符号带入该类),并在范围为该帮助程序类的模板中引用NUM_CATS。
class MyCatListEnumerator {
friend class MyCatList;
enum {
CAT_TABBY = 0,
CAT_GINGER,
CAT_CALICO,
NUM_CATS
};
};
class MyCatList : private MyCatListEnumerator, private CatList<MyCatListEnumerator::NUM_CATS>
{
public:
MyCatList() {/* empty */}
int first_cat = CAT_TABBY;
};
这将在类外声明枚举,但这种方式不是公开的。