我要在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 {
^~~~~
如果您可以向我解释我的文件中有什么问题,我将不胜感激。谢谢。我已经在寻找错误,但没有发现任何结论。
答案 0 :(得分:1)
要定义模板的成员函数,必须声明正在定义模板的成员函数。该 template声明将包含模板参数的名称,以便可以在定义中使用它们。像这样:
template <typename Object>
您已经成功地在构造函数的定义中使用了模板声明,但是未能在其他成员函数的定义中使用模板声明。
此外,您对getInfo
的定义缺少返回类型。另外,Event
没有名为getInfo
的成员(您不小心在声明中添加了下划线)。
此外,请确实意识到必须在实例化它们的转换单元中定义模板函数(以及模板类的成员函数)。因此,如果您在Event.cpp
中定义成员函数,则这是可以实例化模板的唯一翻译单元。
这对于模板的可重用性不是一件好事。通常最好在头文件中定义成员函数。
最后,让裸露的指针指向拥有的内存是一个非常糟糕的主意。
如果您偶然或有意复制Event
实例,则析构函数将尝试两次删除内存,从而导致行为不确定。
对于该类的用户来说,删除该参数并不明显。通过使用不删除的指针构造类,很容易意外误用您的类。