【问题标题】:Calling overloaded function with an array parameter and a non-array parameter使用数组参数和非数组参数调用重载函数
【发布时间】:2017-06-15 02:54:23
【问题描述】:

我有这个重载函数:

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

它给了我:

第一种情况:

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# 中完美编译(具有重载函数和可选参数的知识)。

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

编辑:添加了第二种情况,第一种情况已经得到解答。

【问题讨论】:

  • 请注意,在参数列表中使用[] 是过时的,实际上数组不是按值传递的。因此,如果您来自其他语言,这可能与您的预期不同

标签: c++ arrays overloading overload-resolution


【解决方案1】:

首先,参数声明int numbers[]其实和int* numbers是一样的。那么,

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

如果要调用第二个重载,可以将anArrayOfIntsWithValues的类型更改为int [2],或将参数numbers的类型更改为const int[](或const int*),以使它们匹配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-28
    • 2015-09-10
    • 2019-05-11
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多