我是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文件。
任何帮助都将不胜感激。
答案 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; “