'基础'在C ++中没有迭代器的成员了

时间:2015-01-08 13:33:47

标签: c++ visual-studio-2013

我正在尝试编译一些最初使用Visual Studio 2013在MS Visual Studio C ++ 6.0中构建的代码。

在旧代码中,以下构造经常用于各种数据类型(例如,对于字符串):

std::string someString;
someString = ....;
callSomeFunction(someString.begin().base());

因此,为了使函数能够编辑(在本例中为字符串)原始缓冲区,方法begin()获取它的迭代器,方法base()返回指向第一个元素的指针缓冲区。

在代码中,这不仅用于字符串,还用于许多其他数据类型。 因此我想知道,如果对标准库进行了更改,那么不再支持base()方法吗?

有替代品吗?或者我必须在这里更改代码吗?由于经常使用,我宁愿找到一个更简单的解决方案。

目前我收到如下错误:

  

错误3错误C2039:' base' :不是' std :: _ Vector_iterator>>'

的成员

2 个答案:

答案 0 :(得分:7)

对于容器迭代器,

base没有标准化。它适用于std::reverse_iteratorstd::move_iterator等迭代器适配器。 Microsoft必须将其从实现中删除才能符合ISO C ++标准。

要从容器迭代器获取指针,只需使用&* iter。要获取指向支持容器的连续数组的第一个元素的指针,请使用cont.data()

答案 1 :(得分:0)

你可以直接传递:

callSomeFunction(&someString[0]);

那将是char*。但是,如果您可以更改函数的签名以获取std::string&,那么它将更安全,更首选 - 特别是如果该函数中有任何潜在的内容只是写在someString的末尾。我意识到这并不总是可行的。