2016-11-26 10 views
0

質問は簡単ですが、ここで尋ねるエラーを解決できません。コンパイルエラーC++ヘッダファイルに関数を追加中

私は単純なプログラムを、関数を.hに書き込んで、それを後でメインファイルに書き込むことで壊しています。 これはコンパイルエラーの原因です。

私は

次のエラー与える
#include "remAnagram.h" 
#include<string> 
using namespace std; 

int main(){ 
    string str1, str2; 

    cin >> str1 >> str2; 
    cout << remAnagram(str1, str2); 

    return 0; 
} 

として、メインファイルと

int remAnagram(string str1, string str2){ 
    int occ1[SIZEOFALPHA]; 
    int occ2[SIZEOFALPHA]; 
    int len1, len2, tot=0; 

    len1 = str1.size(); 
    len2 = str2.size(); 
    for(int i =0; i<SIZEOFALPHA; i++){ 
     occ1[i] = 0; 
     occ2[i] = 0; 
    } 
    for(int i =0; i < len1; i++){ 
     occ1[str1[i] - 'a'] += 1; 
    } 
    for(int i = 0; i < len2; i++){ 
     occ2[str2[i] - 'a'] += 1; 
    } 
    for(int i =0; i < SIZEOFALPHA; i++){ 
     tot += abs(occ1[i]- occ2[i]); 
    } 

    return tot; 
} 

#endif // REMANAGRAM_H_INCLUDED 

と関数として2つのファイルを作成:

remAnagram.h | 8 | ERROR: '文字列' でしたこの範囲で宣言されていない

+3

'using namespace std;'を削除し、 'std :: string'を書き出します。 –

+0

明らかに、コンパイラはあなたが話している 'string'を知りません。したがって、使用前に 'namespace std;'を使うか、もっと良い方法として 'std :: string'を実行するのが良いでしょう。 –

+0

@Djackありがとうございました。しかし、まだ文字列コンパイラがあいまいさを取り除いていません。 – krishnakant

答えて

2

の代わりにstd::stringを参照してくださいとなり、習慣から脱出する。

これは、あなたのヘッダーファイルの問題を解決します。

あなたは署名が見えるようにしたい:

int remAnagram(const string& str1, const string& str2) 

また、あなたは、動的リストを扱っている場合は、固定長Cスタイルの配列を使用しないでください。ここの26の任意の長さは今は十分だと思われるかもしれませんが、ßのような他の文字を考慮する必要がある場合や、将来的にはそれを拡張する必要があります。 std::mapのほうがよいでしょう。

+2

'#include 'も削除しなければなりません。 –

+0

ええ、これはトラブルを引き起こしている時代錯誤でいっぱいです。 – tadman

+0

@tadman std :: stringは問題を解決しています..私たちは 'namespace std'を使うべきではないのですか? – krishnakant

1

あなたはinclude

これは汚いソリューションと悪いスタイルですの順序を変更することができます。生産コードでは使用しないでください:あなたの.cppファイルから#include <string>を削除

#include<string> 
using namespace std; 
#include "remAnagram.h" 
+0

ここにはどのように役立っていますか? – krishnakant

+0

@krishnakant、私の問題はあなたのコードがコンパイルされていないと思います。だから、 '#include" remAnagram.h "を入れた後に、あなたのコードをコンパイルする必要があります。 –

+0

それは助けになりますが、コンパイルにどのように役立っているのか尋ねました。 – krishnakant

1
  1. using namespace std;を取り除くとstd::stringはどこにでも
  2. がremAnagram.h
  3. の上に#include <string>を入れて使用し

説明: スニペットには、最初にremAnagram.hが含まれ、コンパイルされます型宣言を#include <string>で含めるまでは、型std :: stringは認識されません。

また、上記のように、using namespace std;は悪い習慣です。

関連する問題