[英]Why can't the compiler deduce my template value from the function argument?
以下内容无法编译:
enum E {A,B,C};
template<E m>
void foo(E m) {}
int main() {
foo(A);
return 0;
}
我得到的错误是:
我不明白这里到底出了什么问题。 为什么编译器不能从函数参数中推导出模板参数?
我需要做些什么来完成这项工作?
如果需要运行时参数,请使用:
void foo(E m) {}
其值为m
的E
型。 (注意:不需要template<E m>
)
如果需要编译时参数,请使用:
template<E m>
void foo() {}
并致电:
foo<A>();
或者,如果您希望foo
适用于所有枚举类型:
template<typename E>
void foo(E m) {}
并可能检查枚举
static_assert(std::is_enum<E>::value, "E is not an enumeration");
在函数体中。 (如果需要,您还可以使用SFINAE从过载集中删除foo
,询问您是否需要帮助)
更新:解释您的原始代码及其错误:
template<E m> void foo(E m) {}
// ^^^ (1) ^^^ (2)
(1)是E
类型的编译时参数m
,(2)是一个运行时参数, 也称为m
,也是E
类型。 由于它具有相同的名称,因此第二个参数隐藏第一个参数。 在函数中使用名称m
只能访问第二个参数,而您无法访问第一个参数。 现在考虑:
template<E m1> void foo(E m2) {}
现在,您可以使用不同的名称访问参数,即m1
和m2
。 如果你这样调用函数:
foo<A>(B);
那么m1
是A
, m2
是B
并且两者都是相同的固定类型E
它们是独立参数,运行时参数的值不会用于编译时参数。
根据您需要的类型或参数(编译时或运行时),您只需省略您不需要的那种,并最终得到上述实现之一。
对于我来说,你真正的问题并不是100%清楚,这对初学者来说并不典型,因为很难描述一个你并不真正理解的问题,但要确保你先了解编译时和编译时的区别。运行时参数以及如何使用它们。
我想你想写:
enum E {A,B,C};
template<typename T>
void foo(T m) {}
int main() {
foo(A);
return 0;
}
它终于明白我为什么不编译。 虽然在我的特定情况下,函数参数是编译时常量(枚举成员),但通常函数参数是运行时相关的。 模板值必须是编译时常量,因此模板值推导不允许使用函数参数值。 如果强制执行此操作的机制是名称隐藏,那么我认为这是偶然的。 结论是,虽然模板化函数类型可以从函数参数类型推导出来,但模板值不可推导。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.