template<typename T1, typename T2>
class Bimap {
public:
class Data {
private:
template<typename T> Data& set(T);
template<> Data& set<T1>(typename T1 v) { /*...*/ }
};
};
这给了我错误:
error: explicit specialization in non-namespace scope 'class Bimap<T1, T2>::Data'
我明白错误在说什么。但为什么我不能这样做呢?我该如何解决?
答案 0 :(得分:14)
忘记模板,重载:
Data& set(T1 v) { /*...*/ }
但这是我有时使用的技巧
你可以在课堂上专门化课程模板:
class {
template<typename T>
struct function_ {
static void apply(T);
};
template<>
struct function_<int> {
...
};
template<typename T>
void function(T t) { return function_<T>::apply(t); }
答案 1 :(得分:0)
@Albert
当我想在自定义容器中添加“trim-excess-capacity”时,我遇到了类似的问题。 std :: vector交换技巧和更改现有容器的声明都不是有效选项。所以我想出了这个:
template <class T, bool isPtr> struct DeleteImp
{
static void Trim(T* to, unsigned int count);
};
template <class T> struct DeleteImp<T, false>
{
static void Trim(T* to, unsigned int count) {}
};
template <class T> struct DeleteImp<T, true>
{
static void Trim(T* to, unsigned int count)
{
for(unsigned int i=0; i<count; i++)
delete to[i];
}
};
我的容器使用如下:
DeleteImp<T, TypeTraits<T>::isPointer>::Trim(buf + length, truelength-length);
您可能还想查看此resource。