尝试编译时,我收到标题错误中声明的错误。我究竟做错了什么?我正在尝试实现模板类HashTable< K,V> :: prime_below(unsigned long n)。但编译器拒绝允许我。
#ifndef HASHTABLE_H
#define HASHTABLE_H
#include <list>
#include <string>
#include <vector>
#include <utility>
#include <iostream>
static const unsigned int max_prime = 1301081;
static const unsigned int default_capacity = 11;
namespace cop4530
{
template <typename K, typename V>
class HashTable
{
public:
HashTable();
HashTable( size_t size = 101 );
~HashTable();
bool contains( const K & k );
bool match( const std::pair<K, V> &kv) const;
bool insert( const std::pair<K, V> &kv );
bool insert( std::pair<K, V> && kv );
bool remove( const K & k );
void clear();
bool load( const char *filename );
void dump();
bool write_to_file( const char* filename );
private:
void makeEmpty();
void rehash();
unsigned long prime_below( unsigned long n);
void setPrimes( std::vector<unsigned long> & vprimes);
};
#include "HashTable.hpp"
}
#endif
以下是hpp文件。这就是我的教师要求我们实现头文件的方式。
template <typename K, typename V>
HashTable<K,V>::HashTable(size_t )
{
}
template <typename K, typename V>
unsigned long HashTable<K,V>::prime_below (unsigned long n)
{
if (n > max_prime)
{
std::cerr << "** input too large for prime_below()\n";
return 0;
}
if (n == max_prime)
{
return max_prime;
}
if (n <= 1)
{
std::cerr << "** input too small \n";
return 0;
}
// now: 2 <= n < max_prime
std::vector <unsigned long> v (n+1);
setPrimes(v);
while (n > 2)
{
if (v[n] == 1)
return n;
--n;
}
return 2;
}
//Sets all prime number indexes to 1. Called by method prime_below(n)
template <typename K, typename V>
void HashTable<K, V>::setPrimes(std::vector<unsigned long>& vprimes)
{
int i = 0;
int j = 0;
vprimes[0] = 0;
vprimes[1] = 0;
int n = vprimes.capacity();
for (i = 2; i < n; ++i)
vprimes[i] = 1;
for( i = 2; i*i < n; ++i)
{
if (vprimes[i] == 1)
for(j = i + i ; j < n; j += i)
vprimes[j] = 0;
}
}
这是下面的主文件
#include "HashTable.h"
using namespace std;
using namespace cop4530;
int main()
{
HashTable<int, string> t(10);
return 0;
}
编译命令和结果
1)g ++ -std = c ++ 11 -Wall -pedantic HashTable.h - 编译好
2)g ++ -std = c ++ 11 -Wall -pedantic HashTable.hpp -
HashTable.hpp:6:1: error: ‘HashTable’ does not name a type
HashTable<K,V>::HashTable(size_t )
^
HashTable.hpp:12:24: error: expected initializer before ‘<’ token
unsigned long HashTable<K,V>::prime_below (unsigned long n)
^
HashTable.hpp:44:15: error: expected initializer before ‘<’ token
void HashTable<K, V>::setPrimes(std::vector<unsigned long>& vprimes)
3)g ++ -std = c ++ -Wall -pedantic main.cpp
/tmp/ccMVi6jr.o: I
n function `main':
main.cpp:(.text+0x36): undefined reference to `cop4530::HashTable<int, std::string>::HashTable(unsigned long)'
main.cpp:(.text+0x47): undefined reference to `cop4530::HashTable<int, std::string>::~HashTable()'
collect2: error: ld returned 1 exit status
答案 0 :(得分:2)
这是错的:
g++ -std=c++11 -Wall -pedantic HashTable.hpp
这些是你得到的错误:
HashTable.hpp:6:1: error: ‘HashTable’ does not name a type
HashTable<K,V>::HashTable(size_t )
^
HashTable.hpp:12:24: error: expected initializer before ‘<’ token
unsigned long HashTable<K,V>::prime_below (unsigned long n)
^
该错误应该非常明确。 HashTable
未命名类型。它没有命名类型,因为它没有声明。它没有声明,因为声明在HashTable.h中。所有其他错误也与HashTable
未定义的事实有关。
HashTable.hpp取决于HashTable.h中的定义,并且自身没有用。它只是一个头文件,尝试编译它是没有意义的。
这也毫无意义:
g++ -std=c++11 -Wall -pedantic HashTable.h
因为那也是一个标题。
这是正确的(除了-std
参数中的拼写错误):
g++ -std=c++ -Wall -pedantic main.cpp
但是你的链接器告诉你:
n function `main':
main.cpp:(.text+0x36): undefined reference to `cop4530::HashTable<int, std::string>::HashTable(unsigned long)'
main.cpp:(.text+0x47): undefined reference to `cop4530::HashTable<int, std::string>::~HashTable()'
collect2: error: ld returned 1 exit status
您尚未定义类模板的所有成员函数。