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

Unable to output vector with an ostream output C++

你好,我想知道我是否可以得到一些帮助来解决我在 C++ 中打印向量内容的问题

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

我收到的错误是错误

 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,然后是proposer,然后是keywords,然后是content。

printIdea 定义为

void Idea::printIdea(ostream& os)const

这意味着该函数中的所有非静态成员都是 const 限定的。因为 keywords.begin() returns std::vector::const_iterator 而不是 std::vector::iteratorstd::vector::const_iterator 不可分配给 ``std::vector::iteratorwhich is howit` 被声明所以你得到错误。你需要改变

vector<string>::iterator it;

vector<string>::const_iterator it;

为了让它工作。

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

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

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

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

这是因为 printIdea 是一个 const 方法。 const 方法不允许修改它们的成员,因此 keywords.begin() returns 一个 vector<string>::const_iterator,而不是一个普通的 (vector<string>::iterator)。您应该更改 it 的类型:

vector<string>::iterator it;

至:

vector<string>::const_iterator it;

要有兼容的类型。

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

auto it = keywords.begin()