0

私は次の愚かなポリシー構造体を書きました:

template
<typename T>
struct SuperLeague
{
public:
  void printLeague(){std::cout << "SuperLegue" << std::endl;};
protected:
  //~SuperLeague(){}
};

そしてホストクラス

template
<typename TT,template <typename C> class Policy>
class League: public Policy<TT>
{
public:
  void fun()
  {
    Policy<TT>().printLeague();
  }
};

私のメインは

int main()
{
  League<int,SuperLeague> k;
  League<int,SuperLeague> kk;
  k.fun();
  kk.printLeague();
  League<int,SuperLeague> *kkk=new League<int,SuperLeague>();
  kkk->fun();
  //delete kkk;
};

ここまでは、すべて正常に動作します。出力は次のとおりです。

SuperLegue
SuperLegue
SuperLegue

Andrei Alexandrescu は著書の 1 つで次の ように書いています。彼は、ポリシー クラスから派生するときにポリシーまたは保護された (またはプライベートな) 継承で仮想デストラクタを使用しない理由を説明し、ポリシーが使用する必要がある軽量で効果的なソリューションは、非仮想保護されたデストラクタを定義することであると提案しています。問題は、コンパイラを使用してそれを実行しようとする~SuperLeague(){}と、デストラクタが保護されていると不平を言うことです。私が間違っていることは何ですか?

4

2 に答える 2