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

Posted

技术标签:

【中文标题】使用指针和向量时没有运算符匹配“*”错误【英文标题】:No operator matches "*" error when using pointers and vectors 【发布时间】:2019-04-23 21:20:01 【问题描述】:

试图通过使用指向函数的指针来传递向量但是我收到错误:

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

【问题讨论】:

returnedData 和您的参数data 的声明在哪里? @ClickRick 声明返回的数据和数据的参数在函数被调用之前发生,但它们没有任何问题,因为函数没有指针就可以正常工作 不使用 pass-by-pointer 可以避免这个问题 【参考方案1】:

订阅运算符[] 的优先级高于取消引用运算符*(例如,参考this)。因此,*newVect[i]*(newVect[i]) 相同,这在这里没有意义。所以你必须在这里写(*newVect)[i],以便在将订阅运算符[i]应用于它之前首先取消引用指向你的向量的指针。

【讨论】:

【参考方案2】:

错误发生在哪里?它是您访问向量项目的地方吗?

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

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

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

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

然后这样称呼它

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

那么你在使用向量和访问元素的时候就不需要解引用指针了。

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

【讨论】:

使用引用的唯一问题是我有多个类和具有不同排序算法的函数,当我出于某种原因一次运行它们时,我引用的实际向量而不是引用得到排序这就是我不知道的原因,这就是我尝试使用指针并遇到此错误的原因。 如果我理解正确,您想在同一输入上运行不同的排序算法。但是如果你传递一个指向原始向量的指针,你将遇到与传递引用相同的问题。如果要保留原始向量,则必须在将其传递给排序方法之前进行复制(或在排序方法中进行复制)。

以上是关于使用指针和向量时没有运算符匹配“*”错误的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 手表中的向量“无运算符“[]”与这些操作数匹配错误

当向量的两个元素相乘时,向量c ++与运算符*不匹配

在数据迁移时,出现错误:运算符不存在:布尔 = 整数提示:没有运算符与给定的名称和参数类型匹配

通过指针、强制转换和取消引用加载向量?

free():实现向量的erase()时指针无效

BigQuery 错误:运算符没有匹配的签名 >=