我正在尝试编译一些最初使用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>>'
的成员
答案 0 :(得分:7)
base
没有标准化。它适用于std::reverse_iterator
和std::move_iterator
等迭代器适配器。 Microsoft必须将其从实现中删除才能符合ISO C ++标准。
要从容器迭代器获取指针,只需使用&* iter
。要获取指向支持容器的连续数组的第一个元素的指针,请使用cont.data()
。
答案 1 :(得分:0)
你可以直接传递:
callSomeFunction(&someString[0]);
那将是char*
。但是,如果您可以更改函数的签名以获取std::string&
,那么它将更安全,更首选 - 特别是如果该函数中有任何潜在的内容只是写在someString
的末尾。我意识到这并不总是可行的。