die folgenden Arten vor:Überlastung mit typedef gibt einen Fehler
#include <iostream>
typedef unsigned long long usize_t;
typedef unsigned __int16 uword_t;
typedef uword_t clockval_t; // time without seconds in format HHMM
std::string toString(clockval_t nClock)
{
return std::to_string((usize_t)nClock/100) + ":" + std::to_string((usize_t)nClock % 100);
}
std::string toString(uword_t nValue)
{
return std::to_string((usize_t)nValue);
}
void test(void)
{
uword_t val = 1;
clockval_t time = 1023; // 10:23
std::cout << "Value: " << toString(val);
std::cout << "time: " << toString(time);
}
Jetzt, wenn ich versuche, dies zu kompilieren, erhalte ich einen Fehler vom Compiler mir zu sagen, dass die std::string toString(clockval_t)
bereits einen Körper hat. Ich verstehe, warum das natürlich passiert, weil der Typdef nur ein Alias für uword_t
ist.
AFAIK die einzigen Lösungen sind über ein separates Verfahren zur Verfügung zu stellen:
std::string toClockString(clockval_t);
oder ein Objekt machen:
class clockval ...
Ist das richtig oder gibt es eine andere Art und Weise der Compiler wählen die machen richtige Überlastung?
Ah, die Freuden des C-Typ-Systems! – Sean
Ja, IMO ist ein bisschen schwach, weil der ganze Sinn von typedefs darin besteht, neue Typen zu erstellen, damit der Compiler sie richtig unterscheiden kann, um sie konsistent zu machen. Ich denke, es gibt jedoch ein Problem mit der Rückwärtskompatibilität. – Devolus