显式专业化,C ++

时间:2011-01-21 13:23:19

标签: c++ explicit-specialization

如何为对象

编写显式特化
Car<T>

在虚方法clear()?

template <class U>
class List
{
   public:
        virtual void clear();

};


template <class T>
template <>
void List < Car <T> >::clear()   //Specialization U = Car <T>, compiler error
{
    ....
}

级车:

template <class T>
class Car
{
   T speed;
   ...
}

编译错误:

错误16错误C3855:'列表':模板参数'Car'与声明h不兼容:... \ List.hpp 75 错误20错误C2264:'List :: clear':函数定义或声明中的错误;函数不叫h:... \ List.hpp 75

但这种结构还可以

template <>
void List < Car <double> >::clear()   //Specialization U = Car <T>, compiler error
{
    ....
}

2 个答案:

答案 0 :(得分:2)

我认为你能做到这一点的唯一方法是:

template<class T>
class Car
{
};

template <class U>
class List
{
   public:
        virtual void clear();

};

template <class T>
class List<Car<T> >
{
    public:
        virtual void clear() { /* specialization */ }
};

或非内联版本:

template <class T>
class List<Car<T> >
{
    public:
        virtual void clear();
};

template <class T>
void List<Car<T> >::clear() {
   /* specialization */ 
}

因为你并没有真正专攻List<T>,而是你部分专门化它,因为模板类型仍然出现。无论如何,我的演绎可能是错误的。

答案 1 :(得分:0)

This faq item应该让你去。

因此它是这样的:

struct Car
{
};

template <>
void List < Car >::clear()   //Specialization U = Car <T>, compiler error
{
    ....
}