我遇到一个问题,示例代码将在代码块环境中编译和运行但不会在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;
我真的不明白为什么这些错误与编译器有关。
抱歉格式化,但我无法接受代码。
答案 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>