为什么会收到此错误?在'<'标记之前的预期初始化程序

时间:2015-11-26 10:36:38

标签: c++ templates

尝试编译时,我收到标题错误中声明的错误。我究竟做错了什么?我正在尝试实现模板类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

1 个答案:

答案 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

您尚未定义类模板的所有成员函数。