在'<'标记之前预期的构造函数,析构函数或类型转换

时间:2011-02-06 22:09:23

标签: c++ templates g++ hashtable

我是C ++的新手,我似乎无法弄清楚导致这些错误的原因。

以下是我的标题文件:

#ifndef TABLE
#define TABLE

#include <iostream>
#include <cstdlib>
#include <vector>

typedef struct {
    double successful , unsuccessful[2] ;
} Perform ;

using namespace std ;

template <class DATA>
class Table {

private :
    vector<DATA>* slot;
    vector<bool>* passBits;
    vector<bool>* full;
    int tableSize;

public :
    explicit Table ( unsigned size = 5 ) ;
    ~Table( ) ; //destructor
    void empty ( ) ;
    bool insert ( DATA & data ) ;
    bool insertD ( DATA & data ) ;
    bool fetch ( DATA & data ) const ;
    void print ( ostream & ) const ;
    Perform perform ( ) const ;
} ;

template <class DATA>
ostream & operator << ( ostream & out , const Table<DATA> & table )
{
    table.print( out ) ;   return out ;
}

#include "table.cpp"

#endif

我的table.cpp如下:

template <class DATA>
Table<DATA> :: Table ( unsigned size ) // Error
{

}

template <class DATA>
Table<DATA> :: ~Table( ) // Error
{

}

template <class DATA>
void Table<DATA> :: empty ( ) // Error
{

}

template <class DATA>
bool Table<DATA> :: insertD ( DATA & data ) // Error
{

}

#include "MyData.hpp"

标记为// Error的前两行有错误。最后两个在“&lt;'token”错误之前有一个“预期的初始化程序”。

这是给我的大纲。除私有字段外,我不允许修改table.hpp文件。

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:2)

你正在编译一个不是的.cpp文件。将类模板的构造函数,方法等的定义直接放入类定义中,并删除.cpp文件。

例如,与编译器看到的代码和shows your first error

进行比较
template<class DATA>
Table<DATA>::Table(unsigned size) {}

请注意,在尝试定义此ctor之前,此代码未定义Table类模板,因此编译器会对首先应该具有的功能感到困惑。


您可以解决脑卒中指令,以防止正确修复代码。首先,永远不要编译table.cpp,也不要让工具假设他们可以编译或处理它作为实现文件(很多人正确地假设)。其次,在table.cpp的顶部包含你的标题(table.hpp?),因为你不太可能使用.cpp作为有效的实现文件来捕获每一个工具。

答案 1 :(得分:1)

可以通过将模板的定义放入头文件来解决此问题。 C ++不支持在不同文件中分离模板的声明和定义。 看到这个 Storing C++ template function definitions in a .CPP file

然而,IBM xlc和HP acc等一些编译器可以做到这一点。

答案 2 :(得分:0)

我看不到您提供的代码有什么问题(除了.cpp文件的非正式包含但这是合法的)。

因此我认为你正在尝试编译table.cpp。如果是这样,那么这是你的错误,因为它是通过头文件中的include语句进行编译的。

您只需要编译使用模板的文件。

编辑:当#include "table.h"中的test.cpp使用时,编译正常。当我尝试编译table.cpp时(在MSVS 2010上)之前&lt; “