当我们编译一个如:void cube(type &a) 的函数时,可能会出现variable or field 'cube' declared void的报错,产生编译器报错的原因是:编译器将函数'cube'当做了一个变量,当编译器试图编译这个变量时,发现并没有void这样的类型,所以编译发生错误。那么,为什么编译器会将原本是函数的cube当成变量处理呢?
一个可能的原因是我们在函数定义之前,并没有定义type这样的类,如string这样一个类型,如果在头文件中没有加入<string>那么,string并没有被定义,这会导致调用string的函数名被编译器当做一个变量来处理。正确的处理办法是在函数定义前,将函数将用到的变量类型定义一遍(加入包含该类型的头文件)。
call of overloaded 'xxx(type&,type&)' is ambiguous:
当我们在定义函数时,函数名的选用可能会出现错误。如swap(int &a,int &b)这是一个交换两个实数引用的函数。当我们将函数完善并编译时,就会出现
call of overloaded 'swap(int&, int&)' is ambiguous的报错。这是函数重载出现了二义性,即函数特征标发生了重复。
那么,为什么会出现这样的报错呢?这是因为我们定义的函数名
swap函数与标准库的std::swap函数冲突,属于调用疏忽。处理方法有两种,一是调用时声明函数名称空间将swap(int &a,int &b)改为::swap(int &a,int &b),在前面加上::;另一种方法是修改函数名称,避免与库中的函数冲突。