2016-10-31 4 views
0

私はC++には新しく、YouTubeからハッシュテーブルプロジェクトを再現しようとしています。 main.cppとhash.cppという新しいヘッダファイル "hash.h"を使って新しいプロジェクトを作成するとき、main.cppをコンパイルして実行すると、私の "ハッシュ"があいまいな私の考えは、私のハッシュがstd :: hashと衝突したことです。それはエラーの原因ですが、私はそれを修正する方法はあまりよく分かりません。助けてください!これは、コード::ブロックで行われます:)リファレンスがあいまいでC++

main.cppに

#include <iostream> 
#include <cstdlib> 
#include <string> 

#include "hash.h" 

using namespace std; 

int main(){ 
    int index; 
    hash hashObj; 
    index = hashObj.Hash("Amanda"); 

    cout << index << endl; 

    return 0; 

} 

hash.h

#include <iostream> 
#include <cstdlib> 
#include <string> 


#ifndef HASH_H_INCLUDED 
#define HASH_H_INCLUDED 

class hash{ 

public: 
    int Hash(std::string key); 
}; 


#endif // HASH_H_INCLUDED 

hash.cpp

#include <iostream> 
#include <cstdlib> 
#include <string> 

#include "hash.h" 

int hash::Hash(string key){ 
    int hash = 0; 
    int index; 

    index = key.length(); 

    return index; 
} 
+3

それを修正するための最良の方法は、名前空間stdを使用して 'を取り除くことで、あなたのコードではどこでも、'、および(HTTP [完全これはC++言語で存在していることを忘れてはいけ]:

これがコンパイルされます://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-bad-practice)。 –

+1

ハッシュテーブルが必要な場合は、C++標準ライブラリの 'std :: unordered_map'を使用してください。 –

+0

これは面白いハッシュ関数です。 PHPはその機構を当時の関数名にハッシュするために使用しました –

答えて

0

あなたは確かに名前を持っていますあなたが疑うように、標準ライブラリと衝突します。


直接修正:

int hash::Hash(std::string key){  //! 

:メインプログラムで

•は、追加、hash.cppファイルで

::hash hashObj;    //! 

•にstd::資格を宣言を変更します

上記の直接的な修正の代わりに、私はカスタムハッシュテーブルのものの名前空間を導入したいと思います。次に、 my::hash。また、Hashのように、最初の文字の大文字の大文字の通常の命名規則を使用していますが、問題はそこに最初にありません(しかし、私はまだそれに名前空間を使用しています)。

+0

"hash :: Hash 'に対する未定義の参照は" index = hashObj.Hash( "Amanda"); " –

+0

'hash.cpp'をコンパイルし、そのオブジェクトファイルとリンクします。ほとんどのコンパイラでは、コマンドラインに 'hash.cpp'を追加するだけですべてのことができます。 –

+0

さらに詳しい情報を提供できますか?私はこれで新しくなっています... –

0

常に使用しないでくださいusing namespace std。 また、コンパイラは参照するハッシュクラスを判断できません。

#include <iostream> 
#include <cstdlib> 
#include <string> 

#include "hash.h" 

int main(){ 
    int index; 
    hash hashObj; 
    index = hashObj.Hash("Amanda"); 

    std::cout << index << std::endl; 

    return 0; 

} 
+0

私は個人的にすべてのこれらの明示的な資格のコストが非常に高いことがわかります。これとは対照的に、 'namespace std;を使うときに必要なのは一つの資格だけです。 –

+0

ええ、あなたがたくさんのインクルードとテンプレートを持っている大きなプロジェクトでは、見つけにくいバグを引き起こすかもしれません: –

+0

例えば、 'int function (T a)'とすると、 (ただし、別のファイルにある可能性があります)、実際にはTの名前空間を最初に調べます。私はそのような問題に直面しました。 –

関連する問題