基于模板参数的模板化枚举类型

时间:2013-08-12 07:26:10

标签: c++ templates enums

我想知道如何做到这一点: 假设我有一个A类,里面有枚举B

class A {

enum B {

};

};

我想创建一个以A作为模板然后假设A具有枚举B类型并接收其val作为参数的函数?我试过像:

template<typename T>
static void Foo(T t, T::B b) {}

但那不起作用..任何人都有想法?

感谢。

2 个答案:

答案 0 :(得分:7)

您需要告诉编译器T::B是一个类型,因为它是一个从属名称,默认情况下假定为非类型。

template<typename T>
static void Foo(T t, typename T::B b) {}
//                   ^^^^^^^^

你也应该公开枚举。此代码示例有效:

class A {
 public:
  enum B {x, y, z};
};

template<typename T>
static void Foo(T t, typename T::B b) {}

int main()
{
  Foo(A(), A::x); // OK
}

有关详细说明,请参阅Where and why do I have to put the “template” and “typename” keywords?

答案 1 :(得分:4)

你必须使用typename关键字才能使它工作:

static void Foo(T t, typename T::B b) {}
                        ^

enum B必须公开。

typename关键字用于指定模板定义或声明中的从属名称是一种类型。它是模板参数中class的同义词。

C ++标准声明:

  

模板声明或定义中使用的名称,即   取决于模板参数,假定不命名类型,除非   适用的名称查找查找类型名称或名称是合格的   通过关键字typename。

因此,除非您明确声明typename T::B b,否则编译器会假定T::B b是值类型而不是类型名称。

总结:

class A {
 public:
  enum B {enum1, enum2};
};

template<typename T>
static void Foo(T t, typename T::B b) {}

int main()
{
  A a;
  Foo(a, a::enum1); 
}

typename