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

Alo*_*lon 3 c++ enums templates

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

class A {

enum B {

};

};
Run Code Online (Sandbox Code Playgroud)

我想创建一个函数,它将A作为模板,然后假设A具有枚举B类型并接收其val作为参数?我尝试过类似的东西:

template<typename T>
static void Foo(T t, T::B b) {}
Run Code Online (Sandbox Code Playgroud)

但这没有用..任何人都有想法?

谢谢.

jua*_*nza 7

您需要告诉编译器这T::B是一个类型,因为它是一个依赖名称,并且默认情况下假定为非类型.

template<typename T>
static void Foo(T t, typename T::B b) {}
//                   ^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

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

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
}
Run Code Online (Sandbox Code Playgroud)

有关深入解释,请参阅"模板"和"typename"关键字的位置和原因?: