2011-01-01 11 views
5

I Template-Funktion bin mit:uint8_t und unsigned char Verknüpfung Fehler

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

wo obj Objekt der Klasse ist:

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) { ... } 

Das Problem ist mit uint8_t Überlastung von my_object :: func() überschreiben. Linker beschwert sich über ungelöste externe Symbole zu Überlasten, die unsigned Char Parameter haben sollten.

Sollte ich ersetzen uint8_t überlastung mit unsigned char überlastung?

Edit: Gerade jetzt bemerkt, beklagt, dass Linker über uint64_t und int64_t auch.

Ich kompilieren unter Windows mit MSVC++ 2008 Express.

Edit: Apologies, I erklärtemy_object :: func (uint8_t Wert) Funktion (und andere), aber ich habe es nicht definiert.

+0

Übrigens verwenden # include, was ist Ihr Compiler? –

+0

MSVC++ 2008 Express – mnn

+1

Was ist die ** genaue ** Fehlermeldung, die Sie bekommen? –

Antwort

0

Ich vermute, dass uint8_t wurde typedef ed als unsigned char, daher warum Sie das sehen.

+0

Mit Blick auf die Quelle, nein. Uint8_t ist Typdef für UINT8. – mnn

+0

hm .. Ich bin mir nicht sicher, aber 'uint8_t' gehört zu' stdint.h' was dazu dient, weg von primitiven Typen zu abstrahieren, die wiederum auf verschiedenen Plattformen anders sein könnten. – Muggen

+0

Die Bibliothek, mit der ich arbeite, enthält eine Include-Datei, die zwischen Build-Umgebungen unterscheidet. Wenn es Windows ist, definiert es alle Int-Typen manuell, wenn Linux es stdint.h und inttypes.h enthält – mnn

8

Dies ist die include Datei sollte die oben genannten Typen (C99 Empfehlungen)

#include <stdint.h>

+1

Wie würde das zu * Verknüpfung * Fehler führen? –

+0

Nein, ich stütze mich auf Windows. – mnn

+0

Es führt zu * link * -Fehlern, weil das Include, das du haben musst, '# include' vor der Kompilierung nicht über die' typedef' Deklarationen alle int32 konvertiert haben ... Mit anderen Worten, während der Kompilierung nicht alle oben genannten speziellen Typen existieren nicht mehr - also sind sie auch beim * Verknüpfen * nicht vorhanden. –