如何以非内联方式为专用模板提供额外的成员函数? 即。
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;)'的确如此 不匹配任何模板声明
答案 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)
我认为你应该理解以下两点:
如果您要指定类主模板,则必须放置'template&lt;&gt;'在特定版本声明之前。但对于成员函数,您不需要放置'模板&lt; ...&gt;'在成员函数定义之前(因为已经设置了特定模板类的类型信息)。
我不认为主模板类与特定版本有关。