C ++模板专业化提供额外的成员函数?

时间:2009-11-09 03:53:16

标签: c++ templates

如何以非内联方式为专用模板提供额外的成员函数? 即。

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

但是当我将sets<bool>::insert(const int& key)写为

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);
}
海湾合作委员会抱怨:

  

模板ID'插入&lt;&gt;'代表'void   ip_set :: insert(const int&amp;)'的确如此   不匹配任何模板声明

3 个答案:

答案 0 :(得分:10)

除了Effo所说的,如果你想在专业化中添加额外的功能,你应该将常用功能移动到基本模板类中。 E.g:

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

答案 1 :(得分:5)

这是因为它不是您模板的功能所以不要使用“template&lt;&gt;”。删除“template&lt;&gt;”后它适用于我如下:

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

我的系统FC9 x86_64。

整个代码:

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

答案 2 :(得分:0)

我认为你应该理解以下两点:

  1. 如果您要指定类主模板,则必须放置'template&lt;&gt;'在特定版本声明之前。但对于成员函数,您不需要放置'模板&lt; ...&gt;'在成员函数定义之前(因为已经设置了特定模板类的类型信息)。

  2. 我不认为主模板类与特定版本有关。