使用指针和向量时没有运算符匹配“*”错误
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<double>
类型,您不能使用 *
operator 取消引用。
也许,如果您需要将可修改的向量传递给方法,则最好传递引用而不是指针。
SortingData Sort(vector<double> &newVect, int arraySize, char choice)
然后这样称呼它
returnedData[2] = insertionSort.Sort(data, elementTotal, orderChoice)
那么你在使用向量和访问元素的时候就不需要解引用指针了。
您也可能不需要传递arraySize
参数,因为vector::size()
返回向量中的元素数。
【讨论】:
使用引用的唯一问题是我有多个类和具有不同排序算法的函数,当我出于某种原因一次运行它们时,我引用的实际向量而不是引用得到排序这就是我不知道的原因,这就是我尝试使用指针并遇到此错误的原因。 如果我理解正确,您想在同一输入上运行不同的排序算法。但是如果你传递一个指向原始向量的指针,你将遇到与传递引用相同的问题。如果要保留原始向量,则必须在将其传递给排序方法之前进行复制(或在排序方法中进行复制)。以上是关于使用指针和向量时没有运算符匹配“*”错误的主要内容,如果未能解决你的问题,请参考以下文章
Visual Studio 手表中的向量“无运算符“[]”与这些操作数匹配错误