3

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

class A {

enum B {

};

};

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

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

但这没有用..有人有想法吗?

谢谢。

4

2 回答 2

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
}

有关深入的解释,请参阅我必须在哪里以及为什么要放置“模板”和“类型名称”关键字?

于 2013-08-12T07:30:02.063 回答
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); 
}

类型名称

于 2013-08-12T07:30:40.883 回答