2010-10-10 3 views
1

Je reçois les erreurs de l'éditeur de liens suivants:Pourquoi ai-je ces erreurs de liens?

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 

Je AguiEventArgs.h qui a ceci:

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); 
}; 

J'ai revérifié et défini tout cela.

Mon événement Agui est ici:

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

sa définition:

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; 
} 

il est utilisé comme ceci:

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

ex:

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

} 

Merci

Répondre

4

Vous devez définir des fonctions de classe dans votre fichier templated d'en-tête, vous ne pouvez pas les mettre dans un fichier .cpp distinct (ne pense même pas à utiliser le mot-clé export mal pris en charge pour le faire).

La raison en est que le compilateur a besoin du code source du modèle chaque fois qu'il est instancié: il doit générer du code séparé pour chaque instanciation de modèle. L'éditeur de liens est suffisamment intelligent pour s'assurer qu'une seule copie de chaque instanciation est utilisée dans l'exécutable final, même si le même modèle est instancié plusieurs fois dans différentes unités de traduction.

+0

Oh, merci beaucoup. – jmasterx

+3

l'exportation n'est pas non-standard, au moins pour aujourd'hui. D'accord avec tout le reste, bien que –

+0

vient de le sortir de la cpp et cela a fonctionné – jmasterx

Questions connexes