2017-08-20 108 views
2

这个错误是什么意思?为什么当我将所有类型加倍时,它不会显示相同的错误?功能指针

C2556 '诠释DIV(INT,INT)':重载函数仅通过从 'div_t DIV(INT,INT)' 返回 类型不同
C2371 'DIV':重新定义; 不同的基本类型
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; 
} 
+0

'using namespace std ;' strike again!去掉它。标准库名称在'std'中有一个很好的理由。 –

回答

5

存在着stdlib.h标准头一个div功能是从iostream包括在内,所以你超载与冲突。

一种方法是使用自己的命名空间(使用命名空间始终是一个好主意),像这样:

#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; 
} 

当然你也可以使用带有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 
1

div函数已被其他人声明(#include<iostream>),因此超载错误。改变你的函数名称或参数(数字/类型)以将其修复或封装在命名空间中(正如Jean-BaptisteYunès所建议的那样)。

0
C2556 'int div(int,int)': overloaded function differs only by return type from 'div_t div(int,int)' 
C2371 'div': redefinition; different basic types 
C2491 'div': definition of dllimport function not allowed 

这些都描述了编译器已经知道函数div

最有可能的cppreference : div

的C++系统仅通过其调用参数区分的功能。这意味着发生第一个错误。

第二种描述(我认为)不同的属性,第三种意思是其他div在库中。

C2664 'int calculate(int,int,int (__cdecl *)(int,int))': cannot convert argument 3 from 'overloaded-function' to 'int (__cdecl *)(int,int)' 

这使得sum看上去像是在一个类中声明,所以是不太相同的结构出现了。请确认。