gpt4 book ai didi

c++ - 关于函数指针、映射和模板的问题

转载 作者:行者123 更新时间:2023-11-30 01:35:02 25 4
gpt4 key购买 nike

我正在学习函数指针和映射。我必须使用函数指针和映射来编写 switch 语句的复制,而无需使用 if 或 switch。

我想编写一个函数 execute(),它接受两个参数“a”和“b”,并使用适当的操作字符执行操作。

#include <iostream>
#include <string>
#include <map>
using namespace std;


// define the function pointer fptr, templated
template <typename T>
using fptr = T(*)(T, T);

template <typename T>
T plus(T a, T b){
return a + b;
}

template <typename T>
T minus(T a, T b){
return a - b;
}

template <typename T>
T multiply(T a, T b){
return a * b;
}

template <typename T>
T divide(T a, T b){
return a / b
}

// Call back the function pointer on two variables
template <typename T>
T operation(fptr<T> f, T a, T b){
f(a, b);
}

// Execute map to fit an operation character to an operation function pointer

template <typename T>
T execute(T a, T b, char c){
std::map<char, fptr<T> > m;
m['+'] = &plus;
m['-'] = &minus;
m['*'] = &multiply;
m['/'] = &divide;

return operation(m[c], a, b);
}

int main(){
execute<int>(1, 2, '+');
execute<double>(1.2, 3.4, '/');
}

以下是我得到的错误。我在回电中没有错别字,但错误仍然是模棱两可的。我想知道为什么会这样。我真的很感激这些建议。非常感谢!

error: reference to 'plus' is ambiguous
m['+'] = &plus;
^
note: candidate found by name lookup is 'plus'
T plus(T a, T b){
^
note: candidate found by name lookup is 'std::__1::plus'
struct _LIBCPP_TEMPLATE_VIS plus : binary_function<_Tp, _Tp, _Tp>
^
error: reference to 'minus' is ambiguous
m['-'] = &minus;
^
note: candidate found by name lookup is 'minus'
T minus(T a, T b){
^
note: candidate found by name lookup is 'std::__1::minus'
struct _LIBCPP_TEMPLATE_VIS minus : binary_function<_Tp, _Tp, _Tp>
^

最佳答案

1) 您在 divide() 中缺少分号,以及 returnoperation() - 不如其他重要。

2) 这是有原因的using namespace std;不受欢迎。有称为 std::plus 的模板仿函数类型和 std::minus有名称冲突。其他人不是这种情况的原因是因为它们与 std 中的内容没有名称冲突。命名空间(即它们是 std::multipliesstd::divides )。

我建议您删除 using namespace std;并在需要时明确说明 std东西,但不这样做的修复方法是使用 &::plus<T>这意味着:获取 plus<T> 的地址, 它位于全局命名空间中(即不在 std 命名空间中)。

此外,您不需要为 execute() 指定类型,因为它们可以从您提供的参数中推导出来(只需确保参数类型相同)。

关于c++ - 关于函数指针、映射和模板的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54895707/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com