2009-11-09 15 views
8

Jak zapewnić dodatkową funkcję członka dla wyspecjalizowanego szablonu w sposób nieinterline? tjSpecjalizacja szablonu C++ w celu zapewnienia dodatkowej funkcji członka?

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); }; 
}; 

Ale gdy piszę sets<bool>::insert(const int& key) jak

narzeka
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:

Template-id 'wstawić <>' do „void ip_set :: insert (const int &) "nie pasuje do żadnego szablonu deklaracji

Odpowiedz

4

Dzieje się tak dlatego, że nie jest to funkcja twojego szablonu, więc nie używaj "szablonu <>". To działa na mnie po usunięciu "szablon <>" jak poniżej:

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

moim systemie FC9 x86_64.

Cały kod:

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

Poza tym co Effo powiedział, jeśli chcesz dodać dodatkową funkcjonalność w specjalnościach należy przenieść wspólną funkcjonalność w klasie szablon bazowy. Np:

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

myślę, że należy zrozumieć następujące dwa punkty:

  1. jeśli chcesz specilize klasę podstawową szablonu, należy umieścić „szablon <>” przed ukończenia specjalistycznych edycji declaration.but jak dla funkcji składowej, nie musisz wstawiać "szablonu < ...>" przed definicją funkcji składowej (ponieważ informacje o typie ukończonej klasy szablonów zostały przez ciebie ustawione).

  2. Nie sądzę, że główna klasa szablonu ma coś wspólnego ze specjalną edycją.

Powiązane problemy