Grazie shodan per i links che mi hanno fornito un'utile spiegazione della teoria alla base dell'articolo presentato su CodeProject che avevo linkato in precedenza, ma il problema non è comunque risolto e forse è stato parzialmente spiegato male da me nel primo post.
Faccio un esempio pratico, così da tentare di spiegarmi meglio.
// MyFileIni.h
#pragma once
#include <string>
#include <sstream>
class CMyFileIni
{
public:
CMyFileIni(void);
~CMyFileIni(void);
// scrive un valore generico in una determinata sezione del file ini
template<typename T> bool WriteIni(myString section,myString key, T value,myString fpath);
// legge un determinato valore dal file ini
template<typename T> bool ReadIni(myString section,myString key, T& value,myString fpath);
[...]
};
#include "MyFileIni.cpp"
L'implementazione di questa classe è tutta contenuta nell'apposito file cpp, così come la definizione della funzione template (non specializzazione).
Ne riporto un frammento
#include "StdAfx.h"
#include "MyFileIni.h"
using namespace std;
CMyFileIni::CMyFileIni(void)
{
}
template<typename T>
inline bool CMyFileIni::WriteIni(myString section,myString key, T value,myString fpath)
{
// blah blah...
}
Ora poniamo il cosa che io abbia 2 classi: ClassA e ClassB, con le loro belle coppie di header e cpp. ClassB è una classe che espone alcune funzioni che devono poter essere usate anche da alcuni metodi di ClassA, quindi nel file ClassA.cpp c'è questa inclusione
#include "classb.h"
#include "MyFileIni.h"
ClassA usa anche la classe CMyFileIni ed il tutto viene compilato e linkato egregiamente (anche senza la necessità di inline).
Ora ipotizziamo che anche ClassB abbia necessità di usare CMyFileIni e quindi anche nel file ClassB.cpp avrò
#include "MyFileIni.h"
A questo punto si scatena il linker con l'errore LNK2005, ovvero: symbol already defined in object