VC ++错误“没有运算符<<匹配这些操作数”,但它适用于其他编译器

时间:2016-05-18 20:08:33

标签: c++ c++11 compiler-errors

这个程序不能在Visual C ++中编译,但是由于某种原因,当使用g ++ -std = c ++ 11和在线编译器运行它时,它几乎没有任何问题(当然,当我评论#include时) stdafx.h中“)。

#include "stdafx.h"
#include <istream>
#include <fstream>
#include <unordered_map>
#include <map>
#include <iostream>
#include <vector>

using namespace std;

class Hashmap
{
std::multimap<char, string> htmap;

public:
void put(char key, const string value)
{
    pair<char, string> m(key, value);
    this->htmap.insert(pair<char, string>(key, value));
}


int isIn(char c, vector<char> v)
{
    for (auto s : v)
        if (c == s)
            return 0;
    return 1;
}

const void get(char key, string word)
{
    int j = word.length();
    vector<char> v;
    vector<char> v2;
    multimap<char, string>::const_iterator Values = this->htmap.find(key);
    int Number = this->htmap.count(key);
    for (int q = 0; q < Number; q++)
    {
        int j = word.length();
        int ok = 1;
        string a = Values->second;
        for (int k = 0; k< word.length(); k++)
            v2.push_back(word[k]);
        for (int i = 0; i< a.length(); ++i)
        {
            if (isIn(a[i], v2) == 1)
                ok = 0;
        }
        v.clear();
        v2.clear();
        if (ok == 1)
        {
            cout << "Word Found: "<< Values->second << endl; // Error Here
        }
        ++Values;
    }
}
void find(const string word)
{
    string s;
    int j = word.length();
    for (int k = 0; k<j; k++)
    {
        char c = word[k];
        this->get(c, word);
    }
}
};

void read(Hashmap t)
{
string key, value;
ifstream f("in.txt");
while (f >> key) // Error Here
{
    for (auto i : key)
        t.put(i, key);
}
string word;
cout << "Word: ";
std::cin >> word; // Error Here
t.find(word);
f.close();
}

int main()
{
    Hashmap t;
    string word;
    read(t);
    return 0;
}

1 个答案:

答案 0 :(得分:2)

  

但是出于某种原因,当使用g ++ -std = c ++ 11和在线编译器运行它时几乎没有任何问题......

我怀疑你已经失踪了

#include <string>

在您的代码中广泛使用std::string

始终包含与您在代码中使用的类/函数相对应的标准c ++标头。

某些编译器只会在std::string等标头文件中使用iostream的前向声明,其他编译器实际上会包含string标题。

另请注意:

using namespace std;
在大多数情况下,

isn't such a good idea。更好地明确使用std::范围来表达您的意图。