c++ - 没有参数列表的模板名称“事件”的无效使用,模板问题
问题描述
我正在 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 {
^~~~~
如果您能向我解释我的文件中有什么问题,我将不胜感激。谢谢你。我已经寻找了我所拥有的错误,但我没有发现任何结论。
解决方案
要定义模板的成员函数,您必须声明您正在定义模板的成员函数。此模板声明将包含模板参数的名称,以便它们可以在定义中使用。像这样:
template <typename Object>
您已经成功地设法在构造函数的定义中使用了模板声明,但未能在其他成员函数的定义中使用模板声明。
此外,您的定义getInfo
缺少返回类型。此外,Event
没有命名成员getInfo
(您不小心在声明中添加了下划线)。
此外,要意识到模板函数(和模板类的成员函数)必须在实例化它们的翻译单元中定义。因此,如果您在 中定义成员函数Event.cpp
,那么这是您可以实例化模板的唯一翻译单元。
这对于模板的可重用性来说并不是一件好事。通常最好在头文件中定义成员函数。
最后,拥有指向拥有内存的裸指针是一个非常糟糕的主意。
Event
如果您意外或故意复制实例,您的析构函数将尝试删除内存两次,从而导致未定义的行为。
对于该类的用户来说,该参数将被删除并不明显。通过使用一个不能被删除的指针来构造它,很容易意外地误用你的类。
推荐阅读
- javascript - 为什么我的 png 没有出现在我的桌子上?
- c# - DevExpress - 如何在 datagridview 中动态修改按钮标题
- android - 我们是否应该使用 NoActionBar 主题?
- javascript - 反应: 回车时关闭软键盘
- webgl - WebGL 中的随机动画
- keycloak - Keycloak - 重定向到身份提供者的注册页面,并在注册后返回应用程序
- java - 使用两个线程会导致 JavaFX 崩溃
- c++ - 递归链表和 C++ 中的分段错误
- javascript - 为什么 React Hook useEffect 警告缺少依赖项:'props'?
- micronaut - 无法通过发布请求反序列化枚举值