簡體   English   中英

純虛擬方法的模板專業化

[英]Template specialization of pure virtual method

希望此代碼可以編譯和工作

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的解決方案: 模板專門化和繼承

如果它不適用於非模板類,為什么還要對模板類使用?

#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

整個類的專業化(而不只是一個成員函數):

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

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

請注意, TempClass<int>不再是抽象類 ,但其他Base類仍然是抽象類( TempClass<float>TempClass<double>TempClass<SomeClassType> ... )。

它不會包含通用類TempClass包含的字段。 您將不得不從通用Base 或中復制粘貼它們,這是更聰明的解決方案,

您將使用兩個專業化都具有的字段創建基類,然后使這些模板類從該基類繼承:

template <typename T>
struct Base
{
   // some members that all Base classes have
};


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


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

這樣就不需要丑陋的復制粘貼了。

可以在類中提供純虛函數的實現。 這不能使類實例化。

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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM