无法使用ostream输出C ++输出向量

时间:2017-05-16 12:19:29

标签: c++ vector operator-overloading ostream

大家好,我想知道我是否能在问题上得到一些帮助我在C ++中打印出矢量的内容

我试图以特定顺序在一个或两个函数调用中输出类的所有变量。但是,当迭代向量时,我收到一个奇怪的错误

我收到的错误是错误

 error C2679: binary '=' : no operator found which takes a right-hand operand of type 
'std::_Vector_const_iterator<std::_Vector_val<std::_Simple_types<std::basic_string<char,std::char_traits<char>,std::allocator<char>>>>>' (or there is no acceptable conversion) 

我的相关代码如下

ifndef idea
#define idea

using namespace std;

class Idea{
private:
    int id;
    string proposer, content;
    vector<string> keywords;
public:
    Idea(int i);
    Idea(int i, string pro, string con);
    void inputIdea();
    int getID(){ return id; };
    string getProposer(){ return proposer; };
    string getContent(){ return content; };
    vector<string> getKeyword();
    bool wordSearch(string word);
    friend ostream& operator<< (ostream& stream, const Idea& i);
    void printIdea(ostream& os)const;
};

bool Idea::wordSearch(string word){
     vector<string>::iterator it;
     for(it = keywords.begin(); it < keywords.end(); it++){
         if (word == *it){
             return true;
         }
     }

     if (content.find(word) != string::npos){
         return true;
     }

     return false;
 }

void Idea::printIdea(ostream& os)const{
     vector<string>::iterator it;

     os << "ID: " << id << endl;
     os << "Proposer:  " << proposer << endl;
     os << "keywords: ";
     for (it = keywords.begin(); it < keywords.end(); it++){ // error C2679
         os << *it << " ,";
     }
     os << endl << "content: " << content << endl;

 }

 ostream& operator<<(ostream& os, const Idea& i)
 {
     i.printIdea(os);
     return os;

 }

我发现它很奇怪,因为迭代器函数在代码的不同部分工作。

 bool Idea::wordSearch(string word){
     vector<string>::iterator it;
     for(it = keywords.begin(); it < keywords.end(); it++){
         if (word == *it){
             return true;
         }
     }

     if (content.find(word) != string::npos){
         return true;
     }

     return false;
 }

我希望打印出id,然后是提议者,然后是关键字,然后是内容。

3 个答案:

答案 0 :(得分:2)

这是因为printIdeaconst方法。我不允许const种方法修改其成员,因此keywords.begin()会返回vector<string>::const_iterator,而不是正常的vector<string>::iterator。您应该更改it的类型:

vector<string>::iterator it;

为:

vector<string>::const_iterator it;

拥有兼容类型。

或者,如果您有一个支持C ++ 11的编译器,您可以让编译器为您解决:

auto it = keywords.begin()

答案 1 :(得分:0)

printIdea定义为

void Idea::printIdea(ostream& os)const

表示该函数中的所有非静态成员都是const限定的。因为keywords.begin()返回std::vector::const_iterator而不是std::vector::iteratorstd::vector::const_iterator不能分配给``std :: vector :: iterator which is how它被声明,所以你得到错误。你需要改变

vector<string>::iterator it;

vector<string>::const_iterator it;

为了让它发挥作用。

或者你可以使用基于范围的循环,甚至不必记住所有这些,如

for (auto& e : keywords)
{
     os << e << " ,";
}

答案 2 :(得分:0)

您需要使用const_iterator,因为您的方法printIdea()是常量。

你应该使用!=将迭代器与end()进行比较。