基于模板参数的模板枚举类型
Templated enum types based on template parameters
我想知道如何做到这一点:假设我有一个类a,里面有枚举B
class A {
enum B {
};
};
我想创建一个函数,将a作为模板,然后假设a具有枚举B类型,并将其val作为参数?我试过类似的东西:
template<typename T>
static void Foo(T t, T::B b) {}
但那没用。。有人有主意吗?
谢谢。
您需要告诉编译器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
}
如需深入解释,请参阅我必须将"template"answers"typename"关键字放在哪里以及为什么:
您必须使用typename关键字才能使其工作:
static void Foo(T t, typename T::B b) {}
^
并且CCD_ 2必须是公共的。
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
相关文章:
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- 如何注册枚举类型到QJSEngine,以便在脚本环境中使用?
- 通过包装器从 C 访问C++ API 时,如何访问枚举类型
- C++/错误:表达式必须具有整数或无作用域枚举类型
- 如何理解c++中在命名空间内部定义的枚举类型enum
- 在类访问混淆中声明的枚举类型
- 在枚举类型上使用std::max是不是一种糟糕的做法
- C++ 在方程中使用变量;错误:表达式必须具有整数或无作用域枚举类型及其他
- 是否可以使用泛型枚举类型作为函数的参数?
- Visual Studio 2017 生成工具与枚举类型的问题
- 使用枚举类型管理存储顺序
- 如何检查类中定义的枚举类型变量是否被分配给?
- 如何从枚举类型中获取枚举值?
- 为什么C++不为枚举类型提供默认"operator>>"函数?
- 确保枚举类型的键/值在软件Revs之间永远不会更改
- MSVC 1 位枚举类型等于 -1,并且相等性测试失败
- 我们可以专业化类模板的枚举(类型)成员吗?
- 错误:以增量方式填充向量时,表达式必须具有整数或无作用域枚举类型
- 枚举类型的重载>>运算符(工作日)
- C 中的枚举类型字符串类别