2010-10-10 71 views
1

我得到以下链接错误:为什么我会收到这些链接器错误?

Error 1 error LNK2001: unresolved external symbol "public: __thiscall AguiEvent<class AguiEmptyEventArgs>::AguiEvent<class AguiEmptyEventArgs>(void)" ([email protected]@@@@[email protected]) AguiWidgetBase.obj 
Error 2 error LNK2001: unresolved external symbol "public: void __thiscall AguiEvent<class AguiEmptyEventArgs>::call(class AguiEmptyEventArgs)" ([email protected][email protected]@@@@[email protected]@@Z) AguiWidgetBase.obj 
Error 3 error LNK2001: unresolved external symbol "public: __thiscall AguiEvent<class AguiControlEventArgs>::AguiEvent<class AguiControlEventArgs>(void)" ([email protected]@@@@[email protected]) AguiWidgetBase.obj 
Error 4 error LNK2001: unresolved external symbol "public: void __thiscall AguiEvent<class AguiControlEventArgs>::call(class AguiControlEventArgs)" ([email protected][email protected]@@@@[email protected]@@Z) AguiWidgetBase.obj 
Error 5 fatal error LNK1120: 4 unresolved externals C:\Users\Josh\Documents\Visual Studio 2008\Projects\Agui\STATIC Release\Agui.exe 

我有AguiEventArgs.h其中有这样的:

class AguiWidgetBase; 

class AguiEmptyEventArgs { 
public: 
    AguiEmptyEventArgs(); 
}; 

class AguiMouseEventArgs { 
    AguiPoint position; 
    int mouseWheelChange; 
    AguiMouseButtonEnum button; 
public: 
    AguiPoint getPosition() const; 
    int getMouseWheelChange() const; 
    AguiMouseButtonEnum getButton() const; 
    int getX() const; 
    int getY() const; 
    AguiMouseEventArgs(); 
    AguiMouseEventArgs(const AguiPoint &position, 
     int mouseWheelChange, AguiMouseButtonEnum button); 
}; 

class AguiKeyEventArgs { 
    AguiKeyEnum key; 
    AguiKeyModifierEnum modKey; 
    bool isAlt; 
    bool isControl; 
    bool isShift; 
public: 
    bool getAlt() const; 
    bool getControl() const; 
    bool getShift() const; 
    AguiKeyEnum getKey() const; 
    AguiKeyModifierEnum getModifierKeyFlags() const; 
    AguiKeyEventArgs(); 
    AguiKeyEventArgs(AguiKeyEnum key, AguiKeyModifierEnum modKey); 
}; 

class AguiControlEventArgs { 
    AguiWidgetBase* control; 
public: 
    AguiWidgetBase* getControl() const; 
    AguiControlEventArgs(); 
    AguiControlEventArgs(AguiWidgetBase* control); 
}; 

我有双重检查和确定所有这些。

我阿桂事件是在这里:

template <typename T> 
class AguiEvent { 
void (*onEvent)(T arg); 
public: 
void setHandler(void (*eventProc)(T arg)); 
void removeHandler(); 
void call(T arg); 
AguiEvent(); 
}; 

其定义为:

template <typename T> 
void AguiEvent<T>::setHandler(void (*eventProc)(T arg)) 
{ 
    onEvent = eventProc; 
} 


template <typename T> 
void AguiEvent<T>::removeHandler() 
{ 
    onEvent = 0; 
} 


template <typename T> 
void AguiEvent<T>::call(T arg) 
{ 
    if(onEvent) 
     onEvent(arg); 
} 

template <typename T> 
AguiEvent<T>::AguiEvent() 
{ 
    onEvent = 0; 
} 

它这样使用:

AguiEvent<AguiEmptyEventArgs> eventThemeChanged; 
    AguiEvent<AguiControlEventArgs> eventChildControlAdded; 
    AguiEvent<AguiControlEventArgs> eventChildControlRemoved; 

例如:

void AguiWidgetBase::addChildControl(AguiWidgetBase *control) 
{ 
    onAddChildControl(control); 
    eventChildControlAdded.call(AguiControlEventArgs(control)); 

} 

谢谢

回答

4

您需要在头文件中定义模板化类函数,不能将它们放在单独的.cpp文件中(甚至不要考虑使用关键字支持得不好的export)。

原因是因为编译器在每次实例化时都需要模板的源代码:它必须为每个模板实例化生成单独的代码。链接器足够聪明,可以确保在最终可执行文件中只使用每个实例的一个副本,即使同一模板在不同翻译单元中多次实例化。

+0

哦好吧谢谢。 – jmasterx 2010-10-10 19:11:38

+3

出口不是非标准的,至少对于今天来说。同意一切,但 – 2010-10-10 19:13:13

+0

只是把它拿出来的CPP,它的工作 – jmasterx 2010-10-10 19:14:37

相关问题