【发布时间】:2016-12-03 10:31:48
【问题描述】:
我在调用静态方法中的模板函数时遇到问题。 这是我的代码: baseEvent.h
#ifndef BASE_EVENT_H
#define BASE_EVENT_H
#include <unordered_map>
#include <functional>
class baseEvent
{
public:
template<typename Sender,typename EventArgs>
using pureEvent = std::function<void(Sender, EventArgs)>;
template<typename pureEvent>
using eventMap = std::unordered_map<int, pureEvent>;
template<typename Sender, typename EventArgs>
struct Event
{
int AddEvent(pureEvent<Sender, EventArgs>);
void RemoveEvent(int);
void LaunchEvents(Sender, EventArgs);
private:
eventMap<pureEvent<Sender,EventArgs>> Events;
};
};
#endif
和baseEvent.cpp
#include "baseEvent.h"
template <typename Sender, typename EventArgs>
int baseEvent::Event<Sender, EventArgs>::AddEvent(pureEvent<Sender, EventArgs> pure_event)
{
auto uniqeID = 0;
if (Events.rbegin() != Events.rend())
uniqeID = Events.rbegin()->first + 1;
Events.insert(std::make_pair(uniqeID, pure_event));
return uniqeID;
}
template <typename Sender, typename EventArgs>
void baseEvent::Event<Sender, EventArgs>::RemoveEvent(int uniqeID)
{
auto it = Events.find(uniqeID);
if (it != Events.end())
Events.erase(it);
}
template <typename Sender, typename EventArgs>
void baseEvent::Event<Sender, EventArgs>::LaunchEvents(Sender sender, EventArgs e)
{
if (Events.empty())return;
for (auto& singleEvent : Events)
{
singleEvent(sender, e);
}
}
另一个类.h
#include "baseEvent.h"
class anotherClass
{
public:
typedef baseEvent::pureEvent<nullptr_t, int> ballEvent;
static void Update();
static int AddOnChangeOwnerEvent(ballEvent);
static void RemoveOnChangeOwnerEvent(int);
static void LaunchOnChangeOwnerEvents(int);
private:
static baseEvent::Event<nullptr_t, int> OnChangeOwnerEvents;
};
另一个类.cpp
#include "anotherClass.h"
baseEvent::Event< nullptr_t, int> ball::OnChangeOwnerEvents;
void ball::Update()
{
LaunchOnChangeOwnerEvents(0);
//.
//.
//.
}
inline int anotherClass::AddOnChangeOwnerEvent(ballEvent ball_event)
{
return OnChangeOwnerEvents.AddEvent(ball_event);
}
inline void anotherClass::RemoveOnChangeOwnerEvent(int uniqeID)
{
return OnChangeOwnerEvents.RemoveEvent(uniqeID);
}
inline void anotherClass::LaunchOnChangeOwnerEvents(int event_args)
{
return OnChangeOwnerEvents.LaunchEvents(nullptr, event_args);
}
它给了我这个错误:
错误 2 错误 LNK2019: 无法解析的外部符号 "public: void __thiscall baseEvent::Event::LaunchEvents(std::nullptr_t,int)" (?LaunchEvents@?$Event@$$TH@baseEvent@@QAEX$$TH@Z) 中引用 函数“公共:静态无效__cdecl anotherClass::LaunchOnChangeOwnerEvents(int)" (?LaunchOnChangeOwnerEvents@ball@@SAXH@Z) E:\projects\ProFCEngine\SoccerAI\anotherClass.obj SoccerAI
它应该可以正常工作,我做错了什么?
更新
如果我使用模板 struct baseEvent::Event; LaunchOnChangeOwnerEvents 会修复,但如果我在主程序中这样做,我会再次出错。
#include "anotherClass.h"
int main()
{
anotherClass c;
ball::AddOnChangeOwnerEvent([](nullptr_t sender, int args)
{
std::cout << "here";
});
c.Update();
return 0;
}
【问题讨论】:
-
是不是同样的错误?
标签: c++