2

クラス MyParent があるとします。

class MyParent
{
public:
  template<namespace T>
  MyParent()
  {
    T* Something;
  }
};

そして、このコンストラクターを使用する派生クラス:

class MyDerived : public MyParent
{
public:
  MyDerived()
  : MyParent<int>()
  {
  }
};

あいまいさがあるため、コンパイルエラーが発生します。コンパイラは、intがコンストラクターではなく、クラスへのテンプレート引数であると見なします。

intをコンストラクターの引数にすることを指定するにはどうすればよいですか?

4

2 に答える 2

4

それは不可能。標準セクション 14.8.1 明示的なテンプレート引数から、それは次のように述べています。

[注: 明示的なテンプレート引数リストは関数テンプレート名の後に続き、変換メンバー関数テンプレートとコンストラクター メンバー関数テンプレートは関数名を使用せずに呼び出されるため、これらの関数テンプレートに明示的なテンプレート引数リストを提供する方法はありません。]

コメントに記載されているように、コンストラクターに type T(またはconst T &)のパラメーターを指定してから、 type のパラメーターを指定してMyDerived呼び出す必要があります。MyParent::MyParentint

于 2009-01-08T19:49:58.023 に答える
4

あなたの質問は継承に固有のものではないことに注意してください。コード例を考えるとMyParent、テンプレート引数リストを受け入れないか、デフォルトのコンストラクターがないため、まったくインスタンス化できません。

コンストラクター テンプレートでインスタンス化MyParentするには、コンパイラーがテンプレート引数を知るための何らかの方法を提供する必要がありますが、引数のないコンストラクターではそれを行うことはできません。MyParentのコンストラクターにパラメーターを指定する必要があります。以下は、Alf P. Steinbachのコードに基づく例です。

template <typename T>
struct UseMethodsOf {};

class MyParent
{
public:
  template <typename T>
  MyParent(UseMethodsOf<T>)
  {
    T* Something;
  }
};

class MyDerived: public MyParent
{
public:
  MyDerived()
  : MyParent(UseMethodsOf<int>())
  {
  }
};
于 2009-01-08T19:53:04.867 に答える