簡體   English   中英

打印 std::vector 時 C++“不匹配 operator&lt;&lt;”<std::pair></std::pair>

[英]C++“ no match for operator<<” when printing a std::vector<std::pair>

我想打印向量 dicVec 以檢查一切是否如我所願。 但我不能。 我已經查過了,但沒有任何幫助。

這是我當前的代碼:

void Translate::read(){
    int i = 0;

    std::ifstream dic("ende.dic");
    if (dic.is_open())
    {
        std::string dicLine;
        while (std::getline(dic, dicLine)){
            std::vector<std::pair<std::string, std::string>> dicVec;
            std::pair<std::string, std::string> dicPair;
            std::size_t pos = dicLine.find(";");
            dicPair.first = dicLine.substr(0, pos);
            //std::cout << dicPair.first << " : ";
            dicPair.second= dicLine.substr(pos+1);
            //std::cout << dicPair.second << std::endl;
            std::cout << dicVec[i];
            i++;
        }
    }
    else {
        throw std::runtime_error("File could not be opened");
    }
}

我還嘗試使用以下方法打印它:

std::cout << dicVec.at(i);

和這個:

for (auto i = dicVec.begin(); i != dicVec.end(); ++i)
    std::cout << *i << ' ';

但是總是有這個錯誤:

no match for operator<<

為了打印我的矢量圖,我必須做什么? 謝謝您的幫助。

您正在嘗試打印std::pair ,但沒有為std::pair實現標准operator<< ,因此您必須自己編寫。

即使你解決了這個問題,你的代碼仍然會失敗,因為當你調用std::cout << dicVec[i];dicVec是空的。 在打印dicVec的內容之前,您沒有將dicPair添加到dicVec 事實上, dicVec應該聲明在循環之上,而不是在循環內部

嘗試更多類似的東西:

typedef std::pair<std::string, std::string> stringPair;
typedef std::vector<stringPair> stringPairVec;

std::ostream& operator<<(std::ostream &out, const stringPair &p) {
    out << p.first << " : " << p.second << "\n";
    return out;
}

std:ostream& operator<<(std::ostream &out, const stringPairVec &vec) {
    for (size_t i = 0; i < vec.size(); ++i) {
        out << vec[i];
    }
    return out;
}

void Translate::read(){

    std::ifstream dic("ende.dic");
    if (!dic.is_open()) {
        throw std::runtime_error("File could not be opened");
    }

    stringPairVec dicVec;
    std::string dicLine;

    while (std::getline(dic, dicLine)) {
        std::size_t pos = dicLine.find(";");
        stringPair dicPair = std::make_pair(
            dicLine.substr(0, pos),
            dicLine.substr(pos+1)
        );
        dicVec.push_back(dicPair);
    }

    std::cout << dicVec;
}

或者,在 C++11 及更高版本中,您可以改為:

using stringPair = std::pair<std::string, std::string>;
using stringPairVec = std::vector<stringPair>;

std::ostream& operator<<(std::ostream &out, const stringPair &p) {
    out << p.first << " : " << p.second << "\n";
    return out;
}

std:ostream& operator<<(std::ostream &out, const stringPairVec &vec) {
    for (const auto &p : vec) {
        out << p;
    }
    return out;
}

void Translate::read(){

    std::ifstream dic("ende.dic");
    if (!dic.is_open()) {
        throw std::runtime_error("File could not be opened");
    }

    stringPairVec dicVec;
    std::string dicLine;

    while (std::getline(dic, dicLine)) {
        std::size_t pos = dicLine.find(";");
        dicVec.emplace_back(
            dicLine.substr(0, pos),
            dicLine.substr(pos+1)
        );
    }

    std::cout << dicVec;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM