首页 > 解决方案 > 没有参数列表的模板名称“事件”的无效使用,模板问题

问题描述

我正在 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 {
       ^~~~~

如果您能向我解释我的文件中有什么问题,我将不胜感激。谢谢你。我已经寻找了我所拥有的错误,但我没有发现任何结论。

标签: c++objecttemplatesg++

解决方案


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

template <typename Object>

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

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


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

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


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

Event如果您意外或故意复制实例,您的析构函数将尝试删除内存两次,从而导致未定义的行为。

对于该类的用户来说,该参数将被删除并不明显。通过使用一个不能被删除的指针来构造它,很容易意外地误用你的类。


推荐阅读