1

我在课堂上有这样的方法。

 Word Sentence::parse_word(std::string &word) {
 }

一切正常。经过一番考虑,我得出的结论是不好。因为在这个方法里面,std::string word没有改变。
所以最好通过它,const std::string &word以使该方法的使用更加明显和清晰。

此外,拥有这种签名的方法我不可能像这样称呼它parse_word(string("some_text))-

所以我决定将签名更改为:

Word Sentence::parse_word( const string &word) {
    string::iterator iter1= word.begin();
    iter1=find( word.begin(),word.end(),'/');
      /*some other code */
  }

即,我不会在此方法中更改该字符串。
我知道我在这里使用像 find 这样的方法来接受非恒定值,但最好将字符串作为 const 传递!

并且因为它被怀疑它不能被编译: 在此处输入图像描述

我想知道,我尝试做的一切都好吗?
以及如何将 const 字符串转换为字符串?(我尝试使用 C 风格的强制转换或 const_cast - 没有成功)。

提前致谢!

4

2 回答 2

9

您应该使用 aconst_iterator而不是iterator,因为您是begin()通过对 的引用来调用的const

string::const_iterator iter1 = word.begin();
//      ^^^^^^

与标准容器的接口一致,std::string定义了begin()成员函数的两个重载:一个返回 a 的非const限定函数std::string::iterator和一个返回 a 的const限定函数const_iterator

由于您begin()通过对 的引用进行调用const,因此选择了返回 a 的后一个重载const_iterator(非const一个显然不可行)。

这就是为什么编译器会拒绝编译上面的例子。在 C++11 中,您可以通过使用来避免这种麻烦auto

auto iter1 = word.begin();
于 2013-04-22T20:04:05.717 回答
4

如果您将 aconst string或引用传递给const string,则需要使用 a const_iterator

string::const_iterator iter1= word.begin();
于 2013-04-22T20:04:59.313 回答