19/10/15 16:41
Roby94
Salve, sto continuando il porting di alcune librerie da C a CPP e vorrei sfruttare al meglio i vantaggi offerti da quest'ultimo rispetto al suo predecessore. In particolare sto cercando di abbandonare l'abbondante utilizzo di funzioni che accettino in ingresso una grande varieta di tipi di parametro a favore di un piu snello template. Il problema è che sto riscontrando diversi problemi nella scrittura di una libreria statica.
Questi sono i due file della libreria rispettivamente EEPROM.h e EEPROM.cpp.
Se aggiunti ad un progetto ricevo come errore del genere
Ho risolto dichiarando nel file EEPROM.cpp
per ogni combinazione di tipi.
Tutto questo funziona finché non compilo la libreria e cerco di richiamare la medesima funzione ricevendo lo stesso errore riportato in precedenza.
Ora, io purtroppo in casa non ho un libro sul CPP, su internet inoltre non riesco a trovare una soluzione, noto che nessuno o quasi aggiunge la definizione della funzione per ogni tipo. Cosa sbaglio? Esiste un metodo piu corretto di realizzare quello di cui ho bisogno? Attualmente sto usando GCC rilasciato con Atmel Studio 7.
Vi ringrazio per ogni aiuto.
Roberto
#pragma once #include <avr/io.h> namespace EEPROM { template <typename T> T Read(uint16_t); template <typename T> void Read(uint16_t, T[], uint16_t); template <typename T> void Write(uint16_t, T); template <typename T> void Write(uint16_t, T[], uint16_t); }
#include "EEPROM.h" template <typename T> T EEPROM::Read(uint16_t address) {/**/} template <typename T> void EEPROM::Read(uint16_t address, T array[], uint16_t n) {/**/} template <typename T> void EEPROM::Write(uint16_t address, T data) {/**/} template <typename T> void EEPROM::Write(uint16_t address, T array[], uint16_t n) {/**/}
Questi sono i due file della libreria rispettivamente EEPROM.h e EEPROM.cpp.
Se aggiunti ad un progetto ricevo come errore del genere
undefined reference to `void EEPROM::Write<unsigned int>(unsigned int, unsigned int*, unsigned int)'
Ho risolto dichiarando nel file EEPROM.cpp
template void EEPROM::Write(uint16_t, uint16_t[], uint16_t);
per ogni combinazione di tipi.
Tutto questo funziona finché non compilo la libreria e cerco di richiamare la medesima funzione ricevendo lo stesso errore riportato in precedenza.
Ora, io purtroppo in casa non ho un libro sul CPP, su internet inoltre non riesco a trovare una soluzione, noto che nessuno o quasi aggiunge la definizione della funzione per ogni tipo. Cosa sbaglio? Esiste un metodo piu corretto di realizzare quello di cui ho bisogno? Attualmente sto usando GCC rilasciato con Atmel Studio 7.
Vi ringrazio per ogni aiuto.
Roberto
aaa