C++ 模板名称的使用无效‘;事件&x2019;如果没有参数列表,模板问题

C++ 模板名称的使用无效‘;事件&x2019;如果没有参数列表,模板问题,c++,object,templates,g++,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(); priv

我是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.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 {
       ^~~~~
Event.cpp:3:1:错误:在没有参数列表的情况下,模板名称“Event”的使用无效
事件::事件(对象*obj){
^~~~~
Event.cpp:3:1:注意:类模板参数推断仅适用于-std=c++1z或-std=gnu++1z
在Event.cpp中包含的文件中:1:0:
Event.hh:6:7:注意:此处声明了“模板类事件”
班级活动{
^~~~~
Event.cpp:7:1:错误:在没有参数列表的情况下,模板名称“Event”的使用无效
事件::~Event(){
^~~~~
Event.cpp:7:1:注意:类模板参数推断仅适用于-std=c++1z或-std=gnu++1z
在Event.cpp中包含的文件中:1:0:
Event.hh:6:7:注意:此处声明了“模板类事件”
班级活动{
^~~~~
Event.cpp:11:1:错误:在没有参数列表的情况下,模板名称“Event”的使用无效
事件::getInfo(){
^~~~~
Event.cpp:11:1:注意:类模板参数推断仅适用于-std=c++1z或-std=gnu++1z
在Event.cpp中包含的文件中:1:0:
Event.hh:6:7:注意:此处声明了“模板类事件”
班级活动{
^~~~~

如果您能向我解释我的文件中的错误,我将不胜感激。谢谢。我已经查找了我的错误,但没有发现任何结论。

要定义模板的成员函数,您必须声明您正在定义模板的成员函数。此模板声明将包括临时函数的名称延迟参数,以便在定义中使用。如下所示:

template <typename Object>
模板
您已经成功地在构造函数的定义中使用了模板声明,但在其他成员函数的定义中没有使用模板声明

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


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

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


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

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


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

若要定义模板的成员函数,必须声明正在定义模板的成员函数。此模板声明将包括指定模板参数的名称,以便在定义中使用。如下所示:

template <typename Object>
模板
您已经成功地在构造函数的定义中使用了模板声明,但在其他成员函数的定义中没有使用模板声明

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


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

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


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

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


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

可能重复我正在进行测试,但这不是我的问题。感谢您的帮助。我更新了信息。可能重复我正在进行测试,但这不是我的问题。谢谢你的帮助。我更新了我的信息。谢谢你的回答。如果我理解得很好,我只需要在头文件so Event.hh中声明一个“template”。返回类型是Object for getInfo(),否?(是的,我不小心在下面加了下划线,谢谢)。我不明白的是如何在Event.cpp文件中使用我的模板。我正在检查我的指针。谢谢你的回答。如果我理解得很好,我只需要在头文件中声明一个“template”,因此Event.hh。返回类型是Object for getInfo(),否?(是的,我无意中加了下划线,谢谢)。我不明白的是如何在Event.cpp文件中使用我的模板。我正在检查指针。