Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 成员模板函数定义和不完整类型_C++_Templates_Incomplete Type - Fatal编程技术网

C++ 成员模板函数定义和不完整类型

C++ 成员模板函数定义和不完整类型,c++,templates,incomplete-type,C++,Templates,Incomplete Type,我试图实现以下目标,但我不确定这是否可能,如果可能,如何实现:我有一个标头,其中声明了一个类,该类有一个模板成员函数,该函数返回对不完整类型的引用。为了让它更具体一点,假设它处理事件,声明如下: struct EventConnection; class EventHandler { public: template<typename Func> const EventConnection& connectToEvent(EventType t, Func

我试图实现以下目标,但我不确定这是否可能,如果可能,如何实现:我有一个标头,其中声明了一个类,该类有一个模板成员函数,该函数返回对不完整类型的引用。为了让它更具体一点,假设它处理事件,声明如下:

struct EventConnection;

class EventHandler {
public:
    template<typename Func>
    const EventConnection& connectToEvent(EventType t, Func f);

    void disconnect(const EventConnection& connection);
};
struct-EventConnection;
类事件处理程序{
公众:
模板
const EventConnection&connectToEvent(事件类型t,函数f);
无效断开连接(常量事件连接和连接);
};
在本例中,
EventConnection
只是一些内部代码,我希望客户机代码在稍后的时候提供给
disconnect
,我希望在这里将其作为一个不完整的类型保留

我知道,理论上,模板的定义应该放在头文件中,或者可以在.cpp文件中提供,只要用将要使用的类型显式地实例化模板。但是在这种情况下,我不能列出这些,因为这是非常随意的,因此我认为我被卡住了,因为如果我真的希望
EventConnection
只在头中被前向声明,那么我不能在头中提供模板定义,但因为我不能在.cpp文件中列出模板实例化,然后我不能在同一个文件中提供模板定义(我可以在该文件中包括/定义我的不完整类型,并在模板体中使用它)


我的评估是否正确,是否应该重新思考?或者,是否有一种方法可以在头文件中向前声明一个类型,并以某种方式在源文件的模板体中使用完整的类型?

模板定义确实必须在实例化时可见

显式实例化可以避免隐式实例化

由于不能使用显式实例化,并且不想向用户提供定义,所以可以使用类型擦除类型而不是模板

从名称来看,
std::function
似乎是一个很好的候选者:

const EventConnection& connectToEvent(EventType, std::function<void (EventType/*, ...*/)>);

很久以前引入了
export
关键字,但正如cppreference所说,export的实现非常罕见,并且在细节上彼此不一致。通常使用pe erase来实现这一点:您定义一个接口,并专门为头中定义的函数模板中的
Func
类型实现它。然后,将该接口传递给一个不透明函数,该函数处理
EventConnection
内部。这或多或少就是
std::function
的实现方式,它可能会直接解决您的问题:)@dyp谢谢,我会研究一下的!
const EventConnection& connectToEvent(EventType, IEventVisitor&);