Ho un problema con la specializzazione dei modelli che vorrei capire. Sto lavorando con Visual C++ 10.0 (2010). Ho una classe come questa:La specializzazione del modello non riesce al collegamento
class VariableManager
{
public:
template<typename VarT>
VarT get(std::string const& name) const
{
// Some code...
}
// This method supposed to be fully evaluated, linkable method.
template<>
std::string get<std::string>(std::string const& name) const;
private:
std::map<std::string, boost::any> mVariables;
};
In teoria, perché mi sono specializzato il metodo "get", il linker dovrebbe essere in grado di raccogliere da un file oggetto. Invece, ottengo un errore riferimento non risolto con il linker se ho posto il metodo nel file di origine:
template<>
std::string VariableManager::get<std::string>(std::string const& name) const
{
// Doing something...
}
Se metto questo metodo nel file di intestazione come linea, la build va più che bene. Capisco che funzioni modello come questo:
template<typename VarT>
VarT get(std::string const& name) const;
deve essere posto nell'intestazione perché il compilatore non sarà in grado di specializzarsi il modello in base al codice chiamante, ma nel caso della piena specializzazione è il l'implementazione di classe che lo fa, quindi il metodo template specializzato dovrebbe già esistere come simbolo pubblico. Qualcuno potrebbe far luce su questo problema?
Divertente, ma sembra che il problema di conformità standard sia stato il problema. Ho rimosso la dichiarazione dalla classe e ho fatto la dichiarazione di specializzazione come da lei suggerito, e il linker non ha avuto problemi. È bene ricordare che le specializzazioni devono essere dichiarate al di fuori dell'ambito della classe. Grazie per il tuo gentile aiuto! – progician
È una vera fortuna per me trovare la tua risposta. È ancora un mistero per me ciò che fa il compilatore se lascio la specializzazione del template all'interno di una classe e cosa rende il linker non in grado di trovarlo. Tuttavia, hai sicuramente salvato la mia giornata! – Nipheris