2012-07-12 63 views
0

可以說我有以下類,它改變從其他接口接收到的數據。具有不同簽名的功能專門化

template <class T> 
class Updater 
{ 
public: 
    Updater(): 
     _db(Database<T>()) 
    { 
    } 

void append(T value) 
{ 
    std::list<T> l = _db.get(); 
    l.push_back(value); 
    _db.set(l); 
} 

void remove(T value) 
{ 
    std::list<T> l = _db.get(); 
    l.remove(value); 
      _db.set(l); 
} 

private: 
    Database<T> _db; 
}; 

所以我用這個整數和浮動和喜歡。我得到一個鏈表,我操縱它。

但可以說,我想用這個類在以下類型的工作:

std::pair<std::string, std::shared_ptr<void>> 

也就是說,與名字相關聯的內存塊。

我可以使用上面的append函數,在將它傳遞迴數據庫之前,將更多內存添加到鏈接列表中。但是,如果我想刪除基於名稱(這對字符串的一部分)塊,我想我可以如下用專業化解決這個問題:

template <> 
void MultiValue<std::pair<std::string, std::shared_ptr<Block>>>::remove(std::string value) 
{ 
} 

,但它不會編譯,抱怨不兼容與以前的定義。

關於如何解決這個問題的任何建議?

+0

也許你可以實現自定義的比較? – GWW 2012-07-12 14:47:13

回答

0

當專門研究類模板上的方法時,必須保持簽名相同。

如果你想改變,你需要專注全班同學簽名:

template<> 
class Updater<std::pair<std::string, std::shared_ptr<Block>>> 
{ 
    ... 
} 
+0

你確定嗎? [鏈接](http://stackoverflow.com/questions/9330561/if-i-want-to-specialise-just-one-method-in-a-template-how-do-i-do-it) – Baz 2012-07-12 14:56:54

+0

@ Baz更正了答案。 – ecatmur 2012-07-12 15:24:33