在没有参数列表的情况下无效使用了模板名称“事件”,模板有问题

时间:2018-10-30 13:30:11

标签: c++ object templates g++

我要在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 :(得分:1)

要定义模板的成员函数,必须声明正在定义模板的成员函数。该 template声明将包含模板参数的名称,以便可以在定义中使用它们。像这样:

template <typename Object>

您已经成功地在构造函数的定义中使用了模板声明,但是未能在其他成员函数的定义中使用模板声明。

此外,您对getInfo的定义缺少返回类型。另外,Event没有名为getInfo的成员(您不小心在声明中添加了下划线)。


此外,请确实意识到必须在实例化它们的转换单元中定义模板函数(以及模板类的成员函数)。因此,如果您在Event.cpp中定义成员函数,则这是可以实例化模板的唯一翻译单元。

这对于模板的可重用性不是一件好事。通常最好在头文件中定义成员函数。


最后,让裸露的指针指向拥有的内存是一个非常糟糕的主意。

如果您偶然或有意复制Event实例,则析构函数将尝试两次删除内存,从而导致行为不确定。

对于该类的用户来说,删除该参数并不明显。通过使用不删除的指针构造类,很容易意外误用您的类。