Компиляция класса шаблона «ожидаемый конструктор, деструктор или преобразование типа перед ошибкой« <'token » - PullRequest
0 голосов
/ 27 февраля 2012

У меня проблемы с компиляцией моего шаблона класса. Это мой list.cpp

using namespace std;

template <class T>
List<T>::List()
{
    length = 0;
}

template <class T>
List<T>::~List()
{

}


template <class T>
List<T> & List<T>::operator=(const List<T> & rhs)
{
    List<T> hha;
    return hha;
}


template <class T>
int List<T>::size()
{
    return length;
}

И это мой список.

#ifndef _LIST_H_
#define _LIST_H_

#include <iterator>
#include <ostream>

using namespace std;

template <class T>
class List
{
    private:

        class ListNode
        {
            public:
                ListNode();
                ListNode(const T element);

                ListNode *next;
                T data;
        };

    public:

        // big3
        List();
        ~List();
        List<T> & operator=(const List<T> & rhs);

        int size();
        bool empty();
        void print(ostream & os) const;


    private:
        ListNode * head;
        ListNode * tail;
        int length;
};

#include "list.cpp"

#endif

когда я запускаю g ++ list.cpp

Я получаю ошибки

ожидаемый конструктор, деструктор или преобразование типов до маркера ‘<’ </p>

для определений конструктора, деструктора и оператора ...

Я не знаю, что кажется неправильным

Ответы [ 4 ]

2 голосов
/ 27 февраля 2012

Реализация шаблона идет в шапке.

Это что-то вроде хака, но так оно и есть.

1 голос
/ 27 февраля 2012

Проблема, с которой вы сейчас сталкиваетесь, заключается в том, что вы list.cpp не включают вас list.h: компилятор видит пару определений для вещей, которые еще не объявлены. Вы можете решить эту проблему, добавив list.h вверху вашего файла:

#include "list.h"
...

Однако это, по сути, приведет к возникновению проблемы: если вы действительно хотите использовать ваш List<T> с каким-либо типом, компилятору необходимо увидеть определение шаблона, в котором используется шаблон класса. То есть, как правило, вы будете реализовывать свои шаблоны в заголовочном файле. Альтернативой является реализация шаблонов в файле реализации и явное создание экземпляров типов, с которыми он будет использоваться. Это вполне разумно для некоторых шаблонов, но для чего-то, предназначенного для использования с неизвестным количеством типов, это не практично.

Кстати, вы используете имена, к которым вы не имеете права прикасаться: имена, начинающиеся с символа подчеркивания, за которым следует заглавная буква, зарезервированы для реализации C ++, то есть компилятора и стандартной библиотеки. Имена, использующие два последовательных подчеркивания в любом месте, также зарезервированы.

0 голосов
/ 27 февраля 2012

Вы компилируете list.cpp, который определяет ваши функции-члены списка. Но он не содержит объявления класса шаблона - это есть в заголовке.

Я вижу, вы включили cpp в заголовок списка. Это будет работать, если вы включите заголовок списка в какой-то другой файл cpp и убедитесь, что list.cpp не будет скомпилирован как отдельный модуль компиляции.

Что я имею в виду, то есть файл main.cpp:

#include "list.h"
int main()
{}

Затем скомпилируйте это с g++ main.cpp.

Обычно вы просто хотите избежать использования файлов cpp при использовании шаблонов вообще. Просто напишите все в шапке и включите это. Или, в качестве альтернативы, я бы хотя бы переименовал ваше list.cpp в list.impl или другое имя. Таким образом, можно было бы попытаться на самом деле попытаться скомпилировать этот файл напрямую.

0 голосов
/ 27 февраля 2012

Поскольку list.hpp не получает #include d в list.cpp, компилятор не знает об определении шаблона в этом заголовке, когда вы пытаетесь скомпилировать list.cpp.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...