2012-07-12 20 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