纯虚方法的模板专业化

时间:2016-06-13 19:35:59

标签: c++ templates abstract-class template-specialization override

期望这段代码编译和工作

template<class T>
class Base
{
    virtual void method() = 0;
};

template<>
void Base<int>::method() { std::cout << "overrided" << std::endl; }

Base<int> base;

但它会出现'Base<int>': cannot instantiate abstract class错误。思想部分特化会使Base<int>非抽象并允许实例化它。

是否有一个像这个一样简短的工作解决方案,并使Base类保持抽象?否则我可以使Base类非抽象或从这里使用Nicol Bolas的解决方案:Template specialization and inheritance

3 个答案:

答案 0 :(得分:4)

如果它不适用于非模板类,为什么它适用于模板类?

#include<iostream>

class Base
{
    virtual void method() = 0;
};

void Base::method() { std::cout << "overrided" << std::endl; }

Base base;

错误:

10 : error: cannot declare variable 'base' to be of abstract type 'Base'
Base base;
^
3 : note: because the following virtual functions are pure within 'Base':
class Base
^
8 : note: virtual void Base::method()
void Base::method() { std::cout << "overrided" << std::endl; }
^
Compilation failed

答案 1 :(得分:2)

整个班级的专业化(而不仅仅是一个成员函数):

template<class T>
struct TempClass
{
    virtual void f() = 0;
};

template <>
struct TempClass<int>
{        
    virtual void f()
    {
       //...
    }
};

请注意,TempClass<int>不再是抽象类,但其他Base类仍然是抽象类,(TempClass<float>TempClass<double>,{ {1}},TempClass<SomeClassType>)。

它不会包含泛型类...包含的字段。您必须从通用Base 复制粘贴它们,这是更聪明的解决方案,

您将使用两个专业化的字段创建基类,然后使这些模板类继承自该基类:

TempClass

这样就不需要难看的复制粘贴了。

答案 2 :(得分:0)

可以在类中提供纯虚函数的实现。这不会使类可实现。

class Base
{
    virtual void method() = 0;
};

void Base::method() { /* Do something */ }

// This is still a problem since Base
// is still an abstract class, i.e. it is not still not
// instantiable.
Base base;