2009-11-09 10 views
8

Come posso fornire una funzione membro aggiuntiva per template specializzati in modo non in linea? cioèSpecializzazione in template C++ per fornire funzionalità extra membro?

template<typename T> 
class sets 
{ 
    void insert(const int& key, const T& val); 
}; 
template<> 
class sets<bool> 
{ 
    void insert(const int& key, const bool& val); 
    void insert(const int& key){ insert(key, true); }; 
}; 

Ma quando scrivo sets<bool>::insert(const int& key) come

template<> 
class sets<bool> 
{ 
    void insert(const int& key, const bool& val); 
    void insert(const int& key); 
}; 
template<> 
void sets<bool>::insert(const int& key) 
{ 
    insert(key, true); 
} 

GCC si lamenta:

template-id 'inserire <>' per ' ip_set vuoto :: inserire (const int &) "fa non corrisponde ad alcuna dichiarazione modello

risposta

4

Questo perché non è una funzione del modello, quindi non utilizzare "modello <>". Funziona per me dopo la rimozione di "template <>", come di seguito:

void sets<bool>::insert(const int& key) 
{ 
    insert(key, true); 
} 

mio sistema FC9 x86_64.

L'intero codice:

template<typename T> 
class sets 
{ 
public: 
    void insert(const int& key, const T& val); 
}; 

template<> 
class sets<bool> 
{ 
public: 
    void insert(const int& key, const bool& val) {} 
    void insert(const int& key); 
}; 

void sets<bool>::insert(const int& key) 
{ 
    insert(key, true); 
} 

int main(int argc, char **argv) 
{ 
     sets<bool> ip_sets; 
     int key = 10; 
     ip_sets.insert(key); 
     return 0; 
} 
9

Oltre a quanto detto effo, se si desidera aggiungere ulteriori funzionalità in specializzazioni si dovrebbe spostare funzionalità comuni in una classe template di base. Ad esempio:

template<typename T> 
class Base 
{ 
public: 
    void insert(const int& key, const T& val) 
    { map_.insert(std::make_pair(key, val)); } 
private: 
    std::map<int, T> map_; 
}; 

template<typename T> 
class Wrapper : public Base<T> {}; 

template<> 
class Wrapper<bool> : public Base<bool> 
{ 
public: 
    using Base<bool>::insert; 
    void insert(const int& key); 
}; 

void Wrapper<bool>::insert(const int& key) 
{ insert(key, true); } 
0

Penso che si dovrebbe comprendere i seguenti due punti:

  1. se la si vuole specilize il modello primario di classe, è necessario inserire il 'modello <>' prima che l'edizione specializzata declaration.but come per la funzione membro, non è necessario inserire il 'modello < ...>' prima della definizione della funzione membro (poiché le informazioni sul tipo della classe template specilizzata sono state impostate dall'utente).

  2. Non penso che la classe template principale abbia qualcosa da fare con l'edizione specilizzata.

Problemi correlati