hownowbrowncow
hownowbrowncow

Reputation: 475

Non standard syntax error in iterator? (C++)

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++;
        }
    }
}

Error message reads:

Severity Code Description Project File Line Error C3867 'std::_Iterator_base12::_Getcont': non-standard syntax; use '&' to create a pointer to member

What does this mean? How can I fix this? Am I not using this iterator schema correctly? I'm attempting to access these elements.

Upvotes: 1

Views: 6361

Answers (3)

Lightness Races in Orbit
Lightness Races in Orbit

Reputation: 385174

You're trying to use the function std::vector<cv::Point3d>::iterator::_Getcont without calling it (()) or using address-of syntax (&), which is indeed non-standard.

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

However, this function is from the internals of Visual Studio's standard library implementation (the leading _ and the lack of a mention in cppreference.com's documentation of the public interface for RandomAccessIterators being the main clues); I have no idea why you're trying to use it. Just dereference the iterator, like everyone else:

const cv::Point3d& thisOne = *col;

Upvotes: 5

Vlad from Moscow
Vlad from Moscow

Reputation: 310990

Should not you use?

cv::Point3d thisOne = col->_Getcont;

Or if _Getcont is a member function

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

Or

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

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

Or maybe you could write simply

cv::Point3d thisOne = *col;

because the type of the left object is the same as the type of expression *col.

In this case the function could be written like

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++;
        }
    }
}

Upvotes: 1

Cory Kramer
Cory Kramer

Reputation: 117876

Since col is a std::vector<cv::Point3d>::iterator you would have to access an attribute from the Point3d using

cv::Point3d thisOne = col->_Getcont;

and if this is a method, make sure you actually call the method

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

Upvotes: 1

Related Questions