过载<<运算符使用指向字符串的指针

时间:2014-01-18 04:50:14

标签: c++ algorithm debugging find overloading

我正在学习使用find方法,据我所知,它返回找到项目的迭代器,这是我的示例代码,我试图找到字符串“foo”

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{
    vector<string> foo;

    vector<string>::iterator v1;
    vector<string>::iterator v2;

    v1=foo.begin();
    v2=foo.end();

    foo.push_back("bar");
    foo.push_back("foo");



    std::vector<string>::const_iterator it = find(v1, v2, "foo");

    cout<<*it;

}

当我尝试编译代码时,我收到以下错误

error C2679: binary '<<' : no operator found which takes a right-hand operand of type 'const std::basic_string<_Elem,_Traits,_Ax>' (or there is no acceptable conversion)

我无法cout对指针的依赖,似乎我必须重载<<运算符但是我必须重载<<运算符才能使用字符串,因为我已经可以做了

string boo = "bar"
cout<<boo;

发生了什么,我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

我可以在GCC下编译它,但MSVC拒绝它。正如克里斯的评论所示,添加#include <string>可以解决问题。

你的程序在运行时崩溃了。在您将值分配给向量之前,您已分配到v1v2,因此it的结果从不指向“foo”。将两个赋值移到两个push_back语句下面可以解决问题。您仍然需要检查it的返回结果,如下所示:

if (it != foo.end()) {
    cout << *it << endl;
} else {
    cout << "*** NOT FOUND" << endl;
}

答案 1 :(得分:0)

添加#include <string>,您应该没问题。

另外,请确保使用C ++ 11进行编译(不是某些编译器的默认值)。

另外,为安全起见,请在{{1>}之后v1v2 push_back。在矢量发生变化后,v1v2可能指向过时的位置。