C++ Can';t访问Mac上的标准向量迭代器_Ptr

C++ Can';t访问Mac上的标准向量迭代器_Ptr,c++,pointers,vector,iterator,std,C++,Pointers,Vector,Iterator,Std,在Visual Studio上,这段代码的工作方式很有魅力: auto child = node.childs.begin(); while (child != node.childs.end()) { vector<int> siblings; for (auto it : node.childs){ if (it != *child._Ptr)siblings.push_back( it ); }

在Visual Studio上,这段代码的工作方式很有魅力:

auto child = node.childs.begin();
    while (child != node.childs.end()) {
        vector<int> siblings;
        for (auto it : node.childs){
            if (it != *child._Ptr)siblings.push_back( it );
        }
        if (CheckSomething( tree, *child._Ptr, siblings ) > 0) {
            //delete that child
            child = node.childs.erase( child );
        }
        else ++child;
    }
auto-child=node.childs.begin();
while(child!=node.childs.end()){
病媒兄弟姐妹;
用于(自动it:node.childs){
如果(it!=*子项._Ptr)为兄弟项,则向后推(it);
}
如果(选中某些内容(树、*子项、兄弟项)>0){
//删除那个孩子
child=node.child.erase(child);
}
else++儿童;
}
但是在XCode上使用相同的代码时,我得到了一些错误,比如_Ptr不存在?同一个std库是否具有相同的结构?为什么会这样

File.cpp:1745:22: No member named '_Ptr' in 'std::__1::__wrap_iter<int *>'
File.cpp:1745:22:在“std::\uu 1::\uu wrap\u iter”中没有名为“\u Ptr”的成员

提前感谢

规范未定义此类成员变量
\u Ptr
是一个特定于实现(在本例中是特定于MSVC)的成员变量,在其他实现中可能存在,也可能不存在


通常,以下划线开头的名称指的是特定于实现的成员。如果你想让你的代码可以移植,或者不想在不同的编译器版本之间中断,千万不要访问它们。

确切地说,它不是同一个库。通过访问VS中的
\u Ptr
,您依赖于实现行为,这些行为可以随时更改,包括更新VS时

我不知道
\u Ptr
是什么(请记住:这是实现定义的,不应该被访问,因此可能没有文档记录),但请查看一下(如果这是
节点.childs
的类型),看看是否可以找到与
\u Ptr
相同的功能


根据经验,不要使用以一个或两个下划线开头的名称。

像_Ptr这样的名称是特定于实现的详细信息-您不应该在代码中使用它们。公平地说,实现应该做出一些努力,不允许您使用它们。以下划线开头,后跟大写字母的名称是为实现保留的,您不应该在自己的代码中使用,也不应该访问/假设实现代码中存在这些名称。故事结束了。显影剂不好;没有cookie给你。我认为
*child.\u Ptr
应该是
(*child)。\u Ptr
child->\u Ptr
,因为
child
是一个迭代器。要正确对待你试图做的事情:
和*it!=&*孩子
谢谢!它现在解释了,但在这种情况下,我如何在Mac上访问等价的Ptr?@RaúlFernándezHernandez检查标准提供的东西。看看哪一个是合适的替代品。我不知道MSVC上的
\u Ptr
指的是什么-它不应该也没有文档记录。您可能需要
.data()
@RaúlFernándezHernandez可能是
如果(它!=*child)
?@tambre std::vector的标准没有指定任何成员变量。@NeilButterworth Fixed.傻瓜我哈哈,谢谢!在这种情况下,child应该是向量的迭代器,“不要使用以一个或两个下划线开头的名称”——更准确地说;保留名称是指a)以下划线开头并后跟大写字母的名称,以及b)在任何位置包含两个连续下划线的任何名称。@JesperJuhl如果您查看下一点,您将看到以下划线开头的每个名称都是保留的(但仅适用于全局命名空间,但仍然是保留的)。最好不要靠近以下划线开头的标识符。@raket1111对,对于全局命名空间,以
开头的所有内容都是保留的。我同意,只是不要:-)谢谢大家,它现在可以按照大家的建议使用(it!=*child)。