저는 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;
}
당신은'abusing namespace std;'입니다. 멈춰. 당신이 아직도 할 수있는 동안 지금 그만하세요. 다른 모든 것이 실패하면 전문가의 도움을 구하십시오. 범죄가 아니라 나쁜 사람이되는 것은 아닙니다. 우리는 모두 당신을 지원하기 위해 여기 있습니다. –
함수 선언을 처음 사용하는 곳에 두는 것이 좋습니다. (지금은 std :: hash를 참조하고있을 것입니다. 바로'using namespace std; '를 사용해서는 안되는 이유입니다). 그리고 당신은'int hash (const string & key);')에 대한 정의를 가지고 있지 않다. Identity는 정수에 대한 끔찍한 해시 함수이다. 또한 해시 함수는 테이블 용량에 전혀 의존하지 않는 것 같아 다소 이상하게 보인다. 나. – Cubic
@KerrekSB 헤더 파일이 아닌 소스 파일에서'namespace std; '(또는 다른 네임 스페이스)를 사용하는 한 아무 문제가 없습니다. 사람들이 항상 모든 라이브러리 이름을 정규화 할 것으로 기대하는 것은 터무니 없습니다. std ::. System.Windows.Controls와 같은 네임 스페이스를 사용하여 C#에서도 동일하게 말하겠습니까? 사람들이 헤더 파일에서 수행하지 않을 것이라고 기대하는 것은 어리석은 일이지만 문제가 발생합니다 (그리고 C++의 오래된 모듈 시스템의 오류입니다) – user1610015