我想知道如何做到这一点: 假设我有一个A类,里面有枚举B
class A {
enum B {
};
};
我想创建一个以A作为模板然后假设A具有枚举B类型并接收其val作为参数的函数?我试过像:
template<typename T>
static void Foo(T t, T::B b) {}
但那不起作用..任何人都有想法?
感谢。
答案 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);
}