2011-01-01 2 views
5

J'utilise la fonction de modèle:uint8_t et non signé erreur reliant omble

template<typename T> void func(const T& value) 
{ 
    obj->func(value); 
} 

où obj est l'objet de la classe:

void my_object::func(int64_t value) { ... } 
void my_object::func(uint64_t value) { ... } 
void my_object::func(uint32_t value) { ... } 
void my_object::func(uint16_t value) { ... } 
void my_object::func(uint8_t value) { ... } 

Le problème est avec uint8_t surcharge de mon_objet :: func() override. Linker se plaint des symboles externes non résolus aux surcharges, qui devrait avoir non signé char paramètre.

Dois-je remplacer uint8_t surcharge avec surcharge ombles non signé?

Edit: Tout à l'heure remarqué que linker se plaint de uint64_t et int64_t aussi.

Je compile sur Windows en utilisant MSVC++ 2008 Express.

Edit: Toutes mes excuses, je déclarémon_objet :: func (valeur uint8_t) fonction (et d'autres), mais je ne pas définir.

+0

Soit dit en passant, quel est votre compilateur? –

+0

MSVC++ 2008 Express – mnn

+1

Quel est le message d'erreur ** exact ** que vous obtenez? –

Répondre

0

Je devine que uint8_t a été typedef ed comme unsigned char, d'où vous voyez cela.

+0

En regardant la source, non. uint8_t est un typedef pour UINT8. – mnn

+0

hm .. Je ne suis pas sûr mais 'uint8_t' appartient à' stdint.h' qui a pour but de faire abstraction des types primitifs qui pourraient être différents sur différentes plateformes. – Muggen

+0

La bibliothèque avec laquelle je travaille a un fichier include, qui différencie les environnements de construction. Si c'est Windows, il définit tous les types int manuellement, si Linux il inclut stdint.h et inttypes.h – mnn

8

Ceci est le fichier include devrait #include utiliser les types mentionnés ci-dessus (recommandations C99)

#include < de stdint.h >

+1

Comment cela conduirait-il à des erreurs de * liaison *? –

+0

Non, je construis sur Windows. – mnn

+0

Il conduit à des erreurs * link * car l'include que vous avez '# include' n'aura pas été converti avant la compilation via les déclarations' typedef' tout l'int32 ... En d'autres termes, lors de la compilation tous les types spéciaux mentionnés ci-dessus ne existent plus - ils ne sont donc pas présents pendant * linking * non plus. –