我有一个函数,它接受类型为T的一些参数:
constexpr inline const bool isReflex(const T x1, const T y1, const T x2, const T y2, const T x, const T y)
使用项目调用此函数形成向量,并显示错误C2664: Cannot convert argument 1 from 'vector<T, std::allocator<_Ty>>' to 'const T'
:
vector<T>* v = new vector<T>; // I am not creating the vector myself, this is just for demonstration.
// The real vector is passed as const vector<T>* to a function executing the following:
if (isReflex(v[i-2], v[i-1], v[i], v[i+1], v[i+2], v[i+3]))
// ^^^^^^ error
这对我来说没什么意义,因为我没有传递矢量而是它的内容。可能导致这种行为的原因是什么?
修改
哎哟。
答案 0 :(得分:4)
这是因为v
不是向量,它是向量的指针。因此,您需要一个解除引用运算符:
if (isReflex((*v)[i-2], (*v)[i-1], (*v)[i], (*v)[i+1], (*v)[i+2], (*v)[i+3]))
错误消息可能看起来不完全清楚的原因是[]
运算符也适用于指针,并且行为类似于具有偏移量的解除引用运算符。换句话说,C ++编译器将变量v
视为内置的向量数组,将索引[i-2]
应用于该数组,并报告错误,因为v[i-2]
表达式的类型是矢量。
实数向量作为
const vector<T>*
传递给函数
您可以创建一个引用变量来保留旧语法:
const vector<T> *pv // function parameter
const vector<T>& v = *pv;
// This will work now
if (isReflex(v[i-2], v[i-1], v[i], v[i+1], v[i+2], v[i+3])) {
...
}
答案 1 :(得分:1)
您在[n]
对象上使用type *
运算符 - 在您的情况vector<T> *
中。你的编译器可能会把它解释为“给我第n个向量开始从这个地址开始计数”而不是“从这个地址指向的向量中给出第n个元素”。