当前位置: 首页 > 知识库问答 >
问题:

为什么编译器不能从函数参数推导出我的模板值?

南宫兴德
2023-03-14

以下内容将无法编译:

enum E {A,B,C};
template<E m> 
void foo(E m) {}

int main() {
    foo(A);
    return 0;
}
    null

我不明白这里到底出了什么问题。为什么编译器不能从函数参数推导出模板参数?

我需要做什么才能让这个工作?

共有1个答案

路昆杰
2023-03-14

如果需要运行时参数,请使用:

void foo(E m) {}

它的值M类型为E。(注意:不需要模板 )

如果需要编译时参数,请使用:

template<E m> 
void foo() {}
foo<A>();
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)是编译时参数M,类型为E,(2)是运行时参数,也称为M,类型为E。由于它具有相同的名称,第二个参数隐藏了第一个参数。在函数中使用名称m只能访问第二个参数,而不能访问第一个参数。现在考虑:

template<E m1> void foo(E m2) {}
foo<A>(B);

根据您需要的类型或参数(编译时或运行时),只需省略不需要的参数,就可以得到上述实现之一。

我不是100%清楚您真正的问题在哪里,这对于初学者来说并不罕见,因为要描述一个您并不真正理解的问题确实很难,但请确保您从理解编译时和运行时参数之间的区别以及如何使用它们开始。

 类似资料:
  • 但是这个技巧在零数组的情况下不起作用。为什么下面的代码不正确?例如,联机编译器ideone打印以下错误消息: 错误:调用'size_of_array(int[0])' std::size_t num=size_of_array(arr)没有匹配的函数;

  • 我试图创建一个带有可选参数的模板函数,但我很难理解编译失败的原因。这是我的测试(设计)代码: 只有当我用这两个参数调用时,代码才会编译。如果我尝试只传递1个参数,编译将失败,出现以下错误: main.cpp:18:34:错误:调用'GetCountIf' std::cout<<“numelements=”< (我用的是C++14)

  • 考虑以下示例: 我的GCC 9.2.0无法编译并出现以下错误: 但是,工作正常。为什么会这样?如何使用显式模板参数调用foo?

  • 我正在学习一个视频教程,我想声明一个模板函数作为模板类的朋友。我不知道为什么代码会抛出错误。 编译器抛出错误。 错误: templates\u friends\u 38。cpp:在“void doSomething2(T)[T=int]”的实例化中:templates\u friends\u 38。cpp:40:19:此处需要templates\u friends\u 38。cpp:32:9:错误

  • 考虑以下示例: 而且,如果我们将非类型模板参数的类型改为占位符类型,如下所示: 然后,GCC接受,而Clang拒绝它(两者都拒绝,如上)。 海合会演示,铿锵演示。 (1)GCC HEAD 11.0.0 202 10117和Clang HEAD 12.0.0(20210118),。

  • 如果我没有理解错的话,类模板定义了一个函数,所以当我调用时,编译器有可能进行隐式强制转换,但是在函数模板的情况下,此时没有函数定义,所以隐式强制转换不会发生。 但我不明白为什么编译器不能创建函数定义,然后应用隐式强制转换? 错误是: 在函数“int main()”中:    25:24:错误:调用“test2::add(void(&)(int))”没有匹配函数    25:24:注:候选人是: