1

在 Visual Studio '12 中出现以下编译错误

error C3867: 'std::vector<_Ty>::at': function call missing argument list; use '&std::vector<_Ty>::at' to create a pointer to member line 39

代码

Vector2dVector mVertices;

/// other code

for (int pointIndex = 0; pointIndex < points.size(); pointIndex++) {
    mVertices.push_back(Vector2d(pointIndex * 2.0f, pointIndex * 3.0f ));
}

int size = mVertices.size();
CCPoint *pointArr = new CCPoint[size];
for(int i = 0; i < size; i++) {
    Vector2d vec2 = mVertices.at[i];  //Line 39 
    //pointArr[i].x = vec2->GetX();
    //pointArr[i].y = vec2->GetY();
}
4

3 回答 3

2
Vector2d vec2 = mVertices.at(i);
                         // ^ ^

你需要括号,而不是括号。at是成员函数。

于 2013-04-11T09:29:59.667 回答
2

问题是你在这里有一个错字:

Vector2d vec2 = mVertices.at[i];  //Line 39 
                            ^ ^

您应该使用()withstd::vector::at方法调用,而不是[]

Vector2d vec2 = mVertices.at(i);  //Line 39 

另一种方法是使用std::vector::operator[]重载(而不是at()):

Vector2d vec2 = mVertices[i];

不同之处在于std::vector::at()对向量索引进行边界检查std::out_of_range,如果索引超出范围(防止缓冲区溢出)则抛出异常。

相反,如果您使用std::vector::operator[],则禁用边界检查。

换句话说,使用std::vector::operator[]你有更快的代码,但你没有对向量索引进行运行时检查(所以你必须注意你的索引,以避免危险的缓冲区溢出)。

(更准确地说,在 Visual Studio 中,如果_SECURE_SCL设置为1,则还对 进行边界检查std::vector::operator[])。

于 2013-04-11T09:41:48.493 回答
1

Vector2dVector::at最有可能是一个函数而不是数组类型的字段:

    Vector2d vec2 = mVertices.at(i);  //Line 39 
于 2013-04-11T09:30:09.077 回答