1

我有这个重载函数:调用重载函数与阵列参数和非阵列参数

CString TestFunction(CString s, int number, int optPar1 = 123, int optPar2 = 456) //... 
CString TestFunction(int index, CString s, int numbers[], int optPar1 = 123, int optPar2 = 456) //... 
CString TestFunction(CString s, int numbers[], int optPar1 = 123, int optPar2 = 456) //... 

当我这样做:

第一情况下:

CString s = TestFunction(someString, anArrayOfIntsWithValues); 

第二壳体:

for (int i =0; i < max; i++) 
{ 
    CString s = TestFunction(i, someString, anArrayOfIntsWithValues); 
} 

它g艾夫斯我:

在第一种情况:

error C2664: 'CString Class1::TestFunction(CString, int, int, int)' : cannot convert parameter 2 from 'const int [2]' to 'int' 
    5 IntelliSense: no instance of overloaded function "Class1::TestFunction" matches the argument list 

在第二种情况:

Error 2 error C2664: 'CString Class1::TestFunction(CString, int,int,int)' : cannot convert parameter 1 from 'int' to 'CString' 
6 IntelliSense: no instance of overloaded function "Class1::TestFunction" matches the argument list 

我新的C++,我不知道什么是错,此代码,但它完全用C#编译(了解重载函数和可选参数)。

注意:这只是真实代码的表示 - 用户定义类型用作参数。

编辑:增加了第二例和第一例已被回答。

+0

请注意,在参数列表中使用'[]'是古老的,实际上数组不是通过值传递。如果您来自其他语言,这可能与您的期望有所不同 –

回答

3

首先,参数声明int numbers[]实际上与int* numbers相同。然后,

anArrayOfIntsWithValuesconst int的数组,即const int[2];可能衰减到const int*,但不能隐式转换为intint*,则调用失败。

如果你想调用的第二个过载,你可以改变的anArrayOfIntsWithValues类型int [2],或更改参数numbers的类型const int[](或const int*),使它们相匹配。