Ожидаемый конструктор, деструктор или преобразование типов перед маркером ‘<’ - PullRequest
2 голосов
/ 07 февраля 2011

Я новичок в 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, содержат ошибку,Последние два имеют ошибку «ожидаемый инициализатор до» <'token'.</p>

Это план, который был дан мне.Мне не разрешено изменять файл table.hpp, за исключением личных полей.

Любая помощь будет оценена.

Ответы [ 3 ]

2 голосов
/ 07 февраля 2011

Вы компилируете файл .cpp, который не является.Поместите определения конструкторов, методов и т. Д. Вашего класса непосредственно в определение класса и удалите ваш файл .cpp.

Например, сравните с этим кодом, который видит компилятор, и показываетВаша первая ошибка :

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

Обратите внимание, что этот код не определяет шаблон класса Table перед попыткой определить этот ctor, поэтому компилятор не понимает, что в первую очередь должно быть в состоянии.


Вы можете обойти свои мозговые инструкции, которые мешают правильно исправить код.Во-первых, никогда не компилируйте table.cpp и не позволяйте инструментам предполагать, что они могут скомпилировать или обработать его как файл реализации (что многие справедливо предполагают).Во-вторых, включите ваш заголовок (table.hpp?) Вверху table.cpp, так как маловероятно, что вы поймаете все случаи использования инструментов, использующих .cpp в качестве допустимого файла реализации.

1 голос
/ 30 ноября 2012

Эту проблему можно решить, поместив определение шаблона в заголовочный файл. C ++ не поддерживает разделение объявления и определения шаблона в разных файлах. Видеть это Сохранение определений функций шаблона C ++ в файле .CPP

Однако некоторые компиляторы, такие как IBM xlc и HP acc, могут это делать.

0 голосов
/ 07 февраля 2011

Я не вижу ничего плохого в предоставленном вами коде (за исключением необычного включения файла .cpp, но это допустимо).

Поэтому я думаю, что вы пытаетесь скомпилировать table.cpp.Если это так, то это ошибка с вашей стороны, поскольку она компилируется с помощью оператора include в вашем заголовочном файле.

Вам нужно только скомпилировать файл, в котором вы используете шаблон.

EDIT: при правильном использовании с #include "table.h" в test.cpp он компилируется нормально.Когда я пытался скомпилировать table.cpp (на MSVS 2010), у меня пропал;до <'</p>

...