2012-10-21 2 views
3

저는 C++을 처음 사용합니다. 이것은 나의 숙제를위한 것이며, 아래는 교수가 우리에게이 과제를 수행하는 데 도움이되는 코드이지만 컴파일되지 않습니다 ... 오류가 생성 된 행을 표시했고 오류 메시지는 입니다 "템플릿 인수 목록없이 템플릿 '해시'를 참조 할 수 없습니다."
어떻게 수정해야할지 모르겠습니다. 누군가 날 올바른 방향으로 향하게 할 수 있습니까?
는 (I, 나는 가정, 오류 메시지에 관련이 선을 제거했습니다.)템플릿 인수 목록이없는 클래스 템플릿을 참조 할 수 없습니다.

클래스는 다음과 같이 정의된다 : CPP에

template <typename HashedObj> 
class HashTable 
{ 
public: 
    //.... 
private: 
    struct HashEntry 
    { 
     HashedObj element; 
     EntryType info; 
     HashEntry(const HashedObj & e = HashedObj(), EntryType i = EMPTY) 
      : element(e), info(i) { } 
    }; 

    vector<HashEntry> array; 
    int currentSize; 

    //... some private member functions.... 

    int myhash(const HashedObj & x) const 
    { 
     int hashVal = hash(x); <<--- line with error 

     hashVal %= array.size(); 
     if(hashVal < 0) 
      hashVal += array.size(); 

     return hashVal; 
    } 
}; 

int hash(const HashedObj & key); 
int hash(int key); 

--- 및 INT 해시() 함수 파일 ----

int hash(const string & key) 
{ 
    int hashVal = 0; 
    for(int i = 0; i < key.length(); i++) 
     hashVal = 37 * hashVal + key[ i ]; 

    return hashVal; 
} 

int hash(int key) 
{ 
    return key; 
} 
+0

당신은'abusing namespace std;'입니다. 멈춰. 당신이 아직도 할 수있는 동안 지금 그만하세요. 다른 모든 것이 실패하면 전문가의 도움을 구하십시오. 범죄가 아니라 나쁜 사람이되는 것은 아닙니다. 우리는 모두 당신을 지원하기 위해 여기 있습니다. –

+1

함수 선언을 처음 사용하는 곳에 두는 것이 좋습니다. (지금은 std :: hash를 참조하고있을 것입니다. 바로'using namespace std; '를 사용해서는 안되는 이유입니다). 그리고 당신은'int hash (const string & key);')에 대한 정의를 가지고 있지 않다. Identity는 정수에 대한 끔찍한 해시 함수이다. 또한 해시 함수는 테이블 용량에 전혀 의존하지 않는 것 같아 다소 이상하게 보인다. 나. – Cubic

+0

@KerrekSB 헤더 파일이 아닌 소스 파일에서'namespace std; '(또는 다른 네임 스페이스)를 사용하는 한 아무 문제가 없습니다. 사람들이 항상 모든 라이브러리 이름을 정규화 할 것으로 기대하는 것은 터무니 없습니다. std ::. System.Windows.Controls와 같은 네임 스페이스를 사용하여 C#에서도 동일하게 말하겠습니까? 사람들이 헤더 파일에서 수행하지 않을 것이라고 기대하는 것은 어리석은 일이지만 문제가 발생합니다 (그리고 C++의 오래된 모듈 시스템의 오류입니다) – user1610015

답변

3

나는 당신이 의심 using namespace std; (당신이 std::없이 vector을 사용하고 있기 때문에 내가 말할 수있는) 거기 std 네임 스페이스에 이름 hash 존재, 그래서 이름이 갈등. 무고한 사용자가이를 #include 너무 std 자신의 프로그램을 오염시킬 수있는

당신은 헤더 파일 대신 전체 std 네임 스페이스에 데려의 std::, 특히를 사용해야합니다.

+0

그것은 * 충돌했습니다! 고마워, 세스! :) – selina

+2

'vector'라는 이름을 많이 언급하고 그것을 생략하고 싶다면'std :: vector;'를 사용할 수도 있습니다. 이렇게하면 들어 본 적이없는 다른 이름으로 수백 개의 이름을 드래그하지 않아도됩니다. –

관련 문제