2016-10-31 5 views
0

저는 C++에 매우 익숙하며 YouTube에서 해시 테이블 프로젝트를 재현하려고합니다. 새 헤더 파일 "hash.h", main.cpp 및 hash.cpp를 사용하여 새 프로젝트를 만들 때 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

를 해결하는 가장 좋은 방법은 네임 스페이스를 사용하여 표준 '을 제거하는 것입니다 코드에서 사방', 및 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

"has = 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의 네임 스페이스를 먼저 조사합니다. 나는 그런 문제에 앞장 섰다. –

관련 문제