无法从vector <t>转换为T.

时间:2017-08-20 10:58:02

标签: c++ vector casting

我有一个函数,它接受类型为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

这对我来说没什么意义,因为我没有传递矢量而是它的内容。可能导致这种行为的原因是什么?

修改

哎哟。

2 个答案:

答案 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个元素”。