неправильное использование имени шаблона «Event» без списка аргументов, проблема с шаблоном - PullRequest
0 голосов
/ 30 октября 2018

Я делаю Observer в CPP, но у меня есть некоторые проблемы, чтобы сделать это. Я поставил только два файла, потому что одни и те же ошибки появляются в других. Я отправляю свой файл следующим образом: Event.hh с объявлением прототипов и т. Д. И Event.cpp с функциями.

Здесь Event.hh:

#ifndef EVENT_HH
#define EVENT_HH

template <typename Object>

class Event {
public:
    Event(Object* obj);
    ~Event();
    Object* getInfo();
private:
    Object* _obj;
};

#endif //EVENT_HH

Здесь Event.cpp:

#include "Event.hh"



Event::Event(Object* obj) {
    this->_obj = obj;
}

Event::~Event() {
    delete this->_obj;
}

Event::getInfo() {
    return this->_obj;
}

Я не очень понимаю, как использовать шаблон и как он работает, но я следовал руководству, единственное отличие состоит в том, что разработчик использует один файл Event.h со всем, что в нем. Я показываю вам ошибку, которую я имею с компиляцией:

    Event.cpp:3:1: error: invalid use of template-name ‘Event’ without an argument list
 Event::Event(Object* obj) {
 ^~~~~
Event.cpp:3:1: note: class template argument deduction is only available with -std=c++1z or -std=gnu++1z
In file included from Event.cpp:1:0:
Event.hh:6:7: note: ‘template<class Object> class Event’ declared here
 class Event {
       ^~~~~
Event.cpp:7:1: error: invalid use of template-name ‘Event’ without an argument list
 Event::~Event() {
 ^~~~~
Event.cpp:7:1: note: class template argument deduction is only available with -std=c++1z or -std=gnu++1z
In file included from Event.cpp:1:0:
Event.hh:6:7: note: ‘template<class Object> class Event’ declared here
 class Event {
       ^~~~~
Event.cpp:11:1: error: invalid use of template-name ‘Event’ without an argument list
 Event::getInfo() {
 ^~~~~
Event.cpp:11:1: note: class template argument deduction is only available with -std=c++1z or -std=gnu++1z
In file included from Event.cpp:1:0:
Event.hh:6:7: note: ‘template<class Object> class Event’ declared here
 class Event {
       ^~~~~

Если бы вы могли объяснить мне, что не так в моих файлах, я буду признателен. Спасибо. Я уже искал ошибки, которые у меня есть, но я не нашел ничего убедительного.

1 Ответ

0 голосов
/ 30 октября 2018

Чтобы определить функцию-член шаблона, вы должны объявить, что вы определяете функцию-член шаблона. Это объявление шаблона будет содержать имена аргументов шаблона, чтобы их можно было использовать в определении. Как это:

template <typename Object>

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

Кроме того, в вашем определении getInfo отсутствует тип возвращаемого значения. Кроме того, Event не имеет члена с именем getInfo (вы случайно добавили подчеркивание в объявлении).


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

Это не очень хорошая вещь для повторного использования шаблона. Обычно лучше определить функции-члены в заголовочном файле.


Наконец, очень плохая идея иметь голые указатели на собственную память.

Если вы сделаете копию экземпляра Event случайно или преднамеренно, ваш деструктор попытается дважды удалить память, что приведет к неопределенному поведению.

Для пользователя класса не очевидно, что аргумент будет удален. Очень легко случайно неправильно использовать ваш класс, создав его с указателем, который не должен быть удален.

...