功能指针

Vuq*_*zov 2 c++ pointers function

这个错误意味着什么?为什么当我将所有类型都加倍时,它不会显示相同的错误?

C2556'int div(int,int)':重载函数的区别仅在于'div_t div(int,int)'返回类型'C2371'div
':redefinition; 不同的基本类型
C2491'div':不允许定义dllimport函数
C2664'int calculate(int,int,int(__ cdecl*)(int,int))':不能将参数3从'overloaded-function'转换为'int( __cdecl*)(int,int)'


#include <iostream>
using namespace std;

int sum(int x, int y) {
    return x + y;
}

int subs(int x, int y) {
    return x - y;
}

int mult(int x, int y) {
    return x * y;
}

int div(int x, int y) {
    return x / y;
}
int calculate(int x, int y, int(*func)(int, int)) {
    return func(x, y);
}
void main() {
    cout<<"Sum:"<< calculate(8, 4, sum)<<endl;
    cout << "Subs:" << calculate(8, 4, subs) << endl;
    cout << "Mult:" << calculate(8, 4, mult) << endl;
    cout << "Div:" << calculate(8, 4, div) << endl;
}
Run Code Online (Sandbox Code Playgroud)

Jea*_*nès 5

标准头中存在一个包含的div函数,因此您的重载与之冲突.stdlib.hiostream

一种方法是使用自己的命名空间(使用命名空间总是一个好主意),如下所示:

#include <iostream>

namespace my {    
  int sum(int x, int y) {
    return x + y;
  }      
  int subs(int x, int y) {
    return x - y;
  }      
  int mult(int x, int y) {
    return x * y;
  }     
  int div(int x, int y) {
    return x / y;
  }
  int calculate(int x, int y, int(*func)(int, int)) {
    return func(x, y);
  }
}

int main() {
  std::cout << "Sum:"  << my::calculate(8, 4, my::sum)  << std::endl;
  std::cout << "Subs:" << my::calculate(8, 4, my::subs) << std::endl;
  std::cout << "Mult:" << my::calculate(8, 4, my::mult) << std::endl;
  std::cout << "Div:"  << my::calculate(8, 4, my::div)  << std::endl;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

当然,您可以使用一些较短的替代方案using:

...
namespace my { ... }
using my;
...
  std::cout << "Sum:"  << my::calculate(8, 4, sum)  << std::endl;
  std::cout << "Subs:" << my::calculate(8, 4, subs) << std::endl;
  std::cout << "Mult:" << my::calculate(8, 4, mult) << std::endl;
  std::cout << "Div:"  << my::calculate(8, 4, my::div)  << std::endl; // scoped to eliminate ambiguity
Run Code Online (Sandbox Code Playgroud)