VCコンパイラの下でerror C 2679、error C 2676、error C 2784、fatal error C 1903エラーをどのように解決するか

4356 ワード

最近、GNUコンパイラの下でコンパイルできる小さなプログラムが作成されましたが、VCコンパイラの下には多くのエラーが表示されています.コンパイル情報を表示します.エラーメッセージは、error C 2679:binary'>>':no operator defined which takes a right-hand operand of type'class std::basic_string,class std::allocator>' (or there is no acceptable conversion) fatal error C1903: unable to recover from previous error(s); stopping compilation
このプログラムは以下に示すように,stdinから単語を読み込み続け,その単語が初めて現れるとその単語を出力し,そうでなければ無視する.注意:入力中の単語はスペース間隔で、句読点は単語の後ろにのみ表示され、単語のアルファベットとの間には他の文字はありません.
例えば入力:where there is a will,there is a way.
出力:where there is a will way
#include <iostream>
#include <cstring>
#include <set>
using namespace std;

int main()
{
    char str[100];
    string word;
    set<string> words;
    while(cin >> str){
	int n = strlen(str) - 1;
	char c = str[n];
	if (!isalpha(c))
	    str[n] = 0;
        word = str;
        if (words.find(word) == words.end()){
            cout << word << " ";
            words.insert(word);
        }           
    }
    return 0;
}

位置決めエラーによりcout<#include <iostream> #include <cstring> #include <set> using namespace std; int main() { char str[100]; string word; set<string> words; while(cin >> str){ int n = strlen(str) - 1; char c = str[n]; if (!isalpha(c)) str[n] = 0; word = str; if (words.find(word) == words.end()){ cout << word.c_str() << " "; words.insert(word); } } return 0; }
しかし、今回のエラー情報はさらに多く、C 2784エラーが多い.
error C2784: 'bool __cdecl std::operator ==(const class std::multiset<_K,_Pr,_A> &,const class std::multiset<_K,_Pr,_A> &)' : could not deduce template argument for 'const class std::multiset<_K,_Pr,_A> &' from 'class std::basic_string,class std::allocator>'
そして今回の位置決めエラーはsetテンプレートファイルに位置決めされました.仕方なくコードを修正し続け、setをvectorに変更するしかありません.修正後のコードは次のとおりです.
#include <iostream>
#include <cstring> 
#include <vector>
using namespace std;

bool my_find(vector<string> &words, string &str)
{
	for(vector<string>::iterator iter = words.begin(); 
	iter != words.end(); ++iter)
		if((*iter) == str)
			return true;
	return false;
}

int main()
{
    char str[100];
    string word;
    vector<string> words;
    while(cin >> str){
		int n = strlen(str) - 1;
		char c = str[n];
		if (!isalpha(c))
			str[n] = 0;
		word = str;
        if (!my_find(words, word)){
            cout << word.c_str() << " ";
            words.push_back(word);
        }           
    }
    return 0;
}
しかし、ここまで来ると、コンパイラは依然としてC 2784エラーを報告しています.しかし、このプログラムはコンパイルエラーをif((*iter)==str)の行に位置決めしました.そこで、最後の修正をしました.コードは次のとおりです.
#include <iostream>
#include <cstring> 
#include <vector>
using namespace std;

bool my_find(vector<string> &words, string &str)
{
	for(vector<string>::iterator iter = words.begin(); 
	iter != words.end(); ++iter)
		//if((*iter) == str)
		if(strcmp((*iter).c_str(), str.c_str()) == 0)
			return true;
	return false;
}

int main()
{
	char str[100];
    string word;
    vector<string> words;
    while(cin >> str){
		int n = strlen(str) - 1;
		char c = str[n];
		if (!isalpha(c))
			str[n] = 0;
		word = str;
        if (!my_find(words, word)){
            cout << word.c_str() << " ";
            words.push_back(word);
        }           
    }
    return 0;
}

ここまで来て、コードはやっとコンパイルされました.私もやっとほっとしましたが、なぜこれらのコードはGNUのコンパイラの下で正常にコンパイルできるのか、VCのコンパイラの下ではだめなのか、疑問に思っています.突然私はキラキラしました!なぜインターネットで検索しないで、他の人がどのように解決したのかを見てみましょう.そこでエラーメッセージを検索しました.次の投稿の回答は、この問題を説明しています.http://bbs.csdn.net/topics/40256358このうち3階と5階はこの質問に答えた.

答えは、プラス#include<string>


これで問題は一段落した.私の最初の解決策に戻って、完全なヘッダファイルを追加した後、やっとGNUとVCのコンパイラの下で順調に通過しました.