取消引用字符串迭代器将无法编译

时间:2013-08-21 07:55:33

标签: c++ visual-studio-2012 compiler-errors iterator

我遇到一个问题,示例代码将在代码块环境中编译和运行但不会在Visual Studio 2012中编译

list<string> names;
names.push_back("Mary");
names.push_back("Zach");
names.push_back("Elizabeth");
list<string>::iterator iter = names.begin();
while (iter != names.end()) {
    cout << *iter << endl;  // This dereference causes compile error C2679
    ++iter;
}

导致以下编译器错误

1>chapter_a0602.cpp(20): error C2679: binary '<<' : no operator found which takes a
right-hand operand of type 'std::basic_string<_Elem,_Traits,_Alloc>' (or there is no
acceptable conversion)
1>          with
1>          [
1>              _Elem=char,
1>              _Traits=std::char_traits<char>,
1>              _Alloc=std::allocator<char>
1>          ]

当我将字符串列表更改为整数列表时,代码将在VS2012中编译并运行。

当我也将取消引用更改为以下内容时,它会编译

cout << *the_iter->c_str() << endl;

但是我在代码中还有另外两个解引用问题

cout << "first item: " << names.front() << endl;
cout << "last item: "  << names.back() << endl;

我真的不明白为什么这些错误与编译器有关。

抱歉格式化,但我无法接受代码。

2 个答案:

答案 0 :(得分:4)

添加以下include指令:

#include <string>

因为这是定义operator<<(std::ostream&, std::string&)的地方。

注意VS2012 supports the range-based for statement,它会将输出循环转换为:

for (auto const& name: names) std::cout << name << std::endl;

答案 1 :(得分:1)

ostream operator<<(ostream& os, const string& str)string标题中定义。

您可能只是忘记将其包含在内,以发生此类错误。

您应该将其包含在文件的顶部:

#include <string>

Live example