Nota che la keyword "inline" l'ho scritta ma è del tutto inutile
Actually, anche se non è pertinente al discorso, la keyword "inline" è obbligatoria nel caso di funzioni o metodi che non sono template: questo perchè altrimenti la funzione o metodo verrebbe compilata tante volte quanti sono i file che la includono, e il linker si lamenterebbe di troppe funzioni con il nome uguale.
Se la funzione/metodo è un template l'errore non c'è perchè i template sono sempre considerati locali alla translation unit dove la specializzazione è generata.
@legacy:
Ho visto un po' il codice (a tratti), e ci sono alcune cose che ti consiglio di rivedere (oltre a quello che ti ha detto TheKaneB):
- dovresti dichiarare tutti gli operatori const, così li puoi sia usare su oggetti const, sia non rischi per sbaglio di scrivere codice negli operatori che modifica gli oggetti stessi.
- I parametri agli operatori potresti dichiararli tutti come "const fixed &", in modo che gli oggetti vengano passati come riferimento; ti eviti la copia degli oggetti ogni volta che chiami un operatore ma devi ora stare attento a usare la funzione equalize_precision, come fai ad esempio in operator+. Per quest'ultimo caso, potresti riscrivere equalize_precision come:
fixed fixed::equalize_precision(const fixed &x) const
{
// se la precisione è inferiore, cambialo
if (precision < x.precision)
{
fixed_numerator value = value * SCALE.x[x.precision - precision];
unsigned char precision = x.precision;
return fixed(value, precision);
}
// altrimenti ritorna lui stesso intatto
return *this;
}
e cambiare operator+ (e tutti gli altri simili) in:
fixed operator + (const fixed_t x, const fixed_t y)
{
fixed a = x.equalize_precision(y);
fixed b = y.equalize_precision(x);
a.value = a.value + b.value;
return a;
}
o qualcosa del genere insomma. Forse si può schiacciare qualche copia in più, ma almeno è un inizio.
- Di solito, nei linguaggi OOP, gli oggetti vengono chiamati con la prima lettera maiuscola (quindi verrebbe Fixed invece di fixed); è una questione di stile quindi puoi fare come vuoi.
- non serve che fai "typedef class fixed fixed_t;" come si farebbe in C perchè (come hai in realtà già visto nel codice), per dichiarare sia struct che class in C++ non è necessario precederle con "struct" (come in C) e "class".
- usare [ ] per settare la precisione è interessante, ma è anche una di quelle cose che sono eccessivamente "zuccherate" e poi ti portano a fare cose strambissime come, chessò, usare "<<" e ">>" per inserire dati in uno stream...
- credo che la funzione show() si possa scrivere in molte meno righe... ma dovrei analizzare bene il suo comportamento quindi in caso te lo dico più tardi.
- Con quel sistema hai veramente troppi file per qualcosa che potrebbe stare tranquillamente in uno o due... così complichi anche la consultazione, in quanto sia devi aprire tantissimi file per vedere poche righe, sia non puoi usare le funzioni di ricerca degli editor.
Bon queste son le cose che sento "a pelle", però puoi iniziare da qui intanto.
PS: e si scrive "overload", non "overlay"!