2

1 つは純粋な仮想の親で、もう 1 つは親から継承する 2 つのテンプレート クラスがあるとします。どちらも、ジェネリック型とファンクターを取るようにテンプレート化されています。例えば:

template<typename T, typename funct>
class pure_virtual{
     //pure virtual members
}
template<typename T, typename funct>
class child : public pure_virtual{
     //members
}

私のメインでは、動的メモリを使用せずに、子クラスへの pure_virtual ポインターを作成したいと考えています。例えば:

int main(){
     pure_virtual<int*,my_functor>* p;
     child<int*,my_functor> c(my_functor);
     p = &c;
     return 0;
}

この実装では、child 型を pure_virtual 型に変換できないというコンパイル エラーが発生します。私がここで間違っていることについて何か考えはありますか? 動的割り当てを使用すれば、これでうまくいくことはわかっています。ただし、可能であれば避けたいと思います。

ありがとう

4

3 に答える 3

3

あなたは厄介な解析の犠牲になりました。child<int*,my_functor> c(my_functor)はオブジェクトを宣言しません child<int*,my_functor>が、代わりに を受け取り、my_functorを返す関数を宣言しますchild<int*,my_functor>

このような関数は に変換できませんpure_virtual<int*,my_functor>*

これを修正するには、その行を次のように変更します。

child<int*,my_functor> c((my_functor()));
于 2013-02-23T05:28:26.423 に答える
1

1)

class child : public pure_virtual< T, funct> {
...

2)

child <int *、my_functor> c(my_functor);

がタイプの場合my_functor、c-torに渡すことはできません。

于 2013-02-23T05:26:54.443 に答える
1

コンパイル可能な例を次に示します。

template<typename T, typename funct>
class pure_virtual{
     //pure virtual members
};

template<typename T, typename funct>
class child : public pure_virtual<T,funct> {
  public:
     //members
     child(funct) { }
};

struct my_functor {};

int main(){
     pure_virtual<int*,my_functor>* p;
     my_functor f;
     child<int*,my_functor> c(f);
     p = &c;
     return 0;
}
于 2013-02-23T05:28:47.333 に答える