迭代器中的非标准语法错误? (C ++)

时间:2015-08-10 11:39:07

标签: c++ pointers iterator

void PointCloud::Create(std::vector<std::vector<cv::Point3d>> threeDPointSpace){
    std::vector<std::vector<cv::Point3d>>::iterator row;
    std::vector<cv::Point3d>::iterator col;
    for (row = threeDPointSpace.begin(); row != threeDPointSpace.end(); row++) {
        for (col = row->begin(); col != row->end(); col++) {
            cv::Point3d thisOne = col._Getcont; // error reported here
            vertices.push_back(VertexFormat(glm::vec3(thisOne.x, thisOne.y, thisOne.z), glm::vec4(1.0, 0.0, 1.0, 1.0)));
            totalData++;
        }
    }
}

错误消息显示:

  

严重级代码说明项目文件行   错误C3867&#39; std :: _ Iterator_base12 :: _ Getcont&#39 ;:非标准语法;   使用&#39;&amp;&#39;创建指向成员的指针

这是什么意思?我怎样才能解决这个问题?我没有正确使用此迭代器架构吗?我试图访问这些元素。

3 个答案:

答案 0 :(得分:5)

您尝试使用函数std::vector<cv::Point3d>::iterator::_Getcont而不调用它(())或使用地址语法(&),这确实是非标准的。< / p>

cv::Point3d thisOne = col._Getcont();

但是,这个函数来自Visual Studio标准库实现的内部(领先_,而cppreference.com's documentation of the public interface for RandomAccessIterators中缺少提及是主要线索);我不知道你为什么要尝试使用它。只需取消引用迭代器,就像其他人一样:

const cv::Point3d& thisOne = *col;

答案 1 :(得分:1)

由于colstd::vector<cv::Point3d>::iterator,您必须使用

Point3d访问属性
cv::Point3d thisOne = col->_Getcont;

如果这是一个方法,请确保实际调用方法

cv::Point3d thisOne = col->_Getcont();

答案 2 :(得分:1)

你不应该使用吗?

cv::Point3d thisOne = col->_Getcont;

或者_Getcont是成员函数

cv::Point3d thisOne = col->_Getcont();

或者

cv::Point3d thisOne = ( *col )._Getcont;

cv::Point3d thisOne = ( *col )._Getcont();

或许你可以简单地写一下

cv::Point3d thisOne = *col;

因为左对象的类型与表达式*col的类型相同。

在这种情况下,函数可以写成

void PointCloud::Create(std::vector<std::vector<cv::Point3d>> threeDPointSpace)
{
    for ( auto &row : threeDPointSpace )
    {
        for ( auto &thisOne : row )
        {
            vertices.push_back(VertexFormat(glm::vec3(thisOne.x, thisOne.y, thisOne.z), glm::vec4(1.0, 0.0, 1.0, 1.0)));
            totalData++;
        }
    }
}