2016-05-18 9 views
2

このプログラムはVisual C++ではコンパイルされませんが、何らかの理由でg ++ -std = C++ 11とオンラインコンパイラ(もちろん、私が#include "stdafx.h"をコメントするとき)。VC++エラー「演算子はこれらのオペランドに一致します」他のコンパイラでも動作します

#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; 
} 
+0

完全なエラーメッセージを表示してください。 –

+0

'namespace std;を使用しています。コンパイルしないと、2つの符号付き/符号なしの比較警告が正しくコンパイルされます。 – user4581301

+0

ちょうどメモ。名前空間stdを使用しないでください。これは非常にエラーが発生しやすいです。また、const std :: string&wordも使用してください。これは良い習慣であり、多くのctor呼び出しを保存します。 – Montaldo

答えて

2

が、G ++ -std = C++ 11とオンラインコンパイラでそれを実行しているとき、それはほとんど何の問題で働いていたいくつかの理由から...

私は「あなたを疑うだろうあなたのコードでstd::stringを広範囲に使用している間に、

#include <string> 

まで不足しました。

コードで使用しているクラス/関数に対応する標準のC++ヘッダーを常に含めます。

一部のコンパイラは、iostreamのようなヘッダーファイルのstd::stringの順方向宣言で動作しますが、実際にはstringヘッダーが含まれます。


も注意してください。ほとんどの場合

using namespace std; 

isn't such a good idea。明示的には、あなたが呼ぶべきものに対してstd::のスコープを使用してください。

+0

ありがとう!それは働いた。 – Paul

+0

Zut。忘れてしまったのは、 'using namespace std;'を削除する前に、#include を追加したことです。両方の変更はVS 2015に基づいて構築する必要がありました。 – user4581301

関連する問題