使用指针和向量时,没有运算符匹配“ *”错误

时间:2019-04-23 21:20:02

标签: c++ pointers vector

尝试通过使用指向函数的指针传递矢量,但是我收到错误消息:

E0349   no operator "*" matches these operands

很确定我也引用正确,所以我不确定为什么会这样。

代码如下:

public:
SortingData Sort(vector<double> *newVect, int arraySize, char choice)
{
    clock_t timer;
    double duration;

    cout << "Insertion Sort:" << endl;
    int i, key, j;
    if (choice == 'a')
    {
        timer = clock();
        for (i = 1; i < arraySize; i++) {
            key = *newVect[i];
            j = i - 1;


            checks++;
            while (j >= 0 && *newVect[j] > key) {
                checks++;
                *newVect[j + 1] = *newVect[j];
                j = j - 1;
                swaps++;
            }
            swaps++;
            *newVect[j + 1] = key;
            cout << *newVect[i] << " ";
        }
    }
    else if (choice == 'd')
    {
        timer = clock();
        for (i = 1; i < arraySize; i++) {
            key = *newVect[i];
            j = i - 1;


            checks++;
            swaps++;
            while (j >= 0 && *newVect[j] < key) {
                checks++;
                *newVect[j + 1] = *newVect[j];
                j = j - 1;
                swaps++;
            }
            *newVect[j + 1] = key;
        }
    }


    duration = (clock() - timer) / (double)CLOCKS_PER_SEC;
    for (int i = 0; i < arraySize; i++)
    {
        cout << *newVect[i] << " ";
    }
    cout << endl;
    cout << "Checks: " << checks << endl;
    cout << "Swaps: " << swaps << endl;
    cout << "Time to complete: " << duration;
    return {"Insertion Sort",checks,swaps,duration};
 }
};

这是我调用函数的方式:

returnedData[2] = insertionSort.Sort(&data, elementTotal, orderChoice);

2 个答案:

答案 0 :(得分:3)

订阅操作符*的优先级高于取消引用操作符*newVect[i]的优先级(例如,参考this)。因此,*(newVect[i])(*newVect)[i]相同,在这里没有意义。因此,您必须在此处编写[i],以便首先取消对向量的指针,然后再将订阅运算符Ext.define('mypackages.component', { extend: 'Ext.container.Container', xtype: 'myaddressfield', items: [ { xtype: 'textfield', fieldLabel: 'Address', name: 'address', id: 'address', labelAlign : 'right', width: 265, allowBlank: false } ], constructor: function () { this.callParent(); console.log('I am entering here!!!'); } }); Ext.define('mypackages.maincomp', { extend: 'Ext.window.Window', itemId: 'maincomp', xtype: 'maincomp', modal: true, bodyPadding: 10, height: 350, width: 270, closeAction: 'destroy', resizable: false, renderTo: Ext.getBody(), layout: { type: 'table', columns: 1 }, items: [ { xtype: 'textfield', fieldLabel: 'Name', name: 'name', labelAlign: 'right', width: 265, allowBlank: false }, { xtype: 'textfield', fieldLabel: 'Age', name: 'age', labelAlign: 'right', width: 265, allowBlank: false }, { xtype: 'textfield', fieldLabel: 'Phone', name: 'phone', labelAlign: 'right', width: 265, allowBlank: false }, { xtype: 'myaddressfield' } ] }); 应用到它。

答案 1 :(得分:0)

在哪里发生错误?在这里您可以访问矢量项目吗?

尝试(*newVect)[i]首先将指针解除对向量的引用,然后访问向量中的索引。

索引运算符[]的优先级高于解引用运算符*的优先级。因此,当您编写*newVect[i]时,它首先尝试访问指针中的ith元素(即,向量数组中的ith向量,这可能会导致运行时错误),然后对其取消引用。但这不是因为newVect[i]的类型为vector<double>,您不能使用*操作符取消引用。

也许,如果您需要将可修改的向量传递给方法,那么最好还是传递一个引用而不是指针。

SortingData Sort(vector<double> &newVect, int arraySize, char choice)

并像

那样称呼它
returnedData[2] = insertionSort.Sort(data, elementTotal, orderChoice)

然后,当您使用向量和访问元素时,不需要取消对指针的引用。

您也可能不需要传递arraySize参数,因为vector::size()返回向量中的元素数。