ええ、テンプレートの仮想クラス メンバー関数を使用することはできません。その部分を理解しようとするのではなく、それは理にかなっています...そして、私は悪魔のように多重/仮想継承を回避しようとしています。
テンプレート クラス A と、A から継承する抽象テンプレート クラス B、および B から継承する C があります。
template <typename T>
class A
{
protected:
T val;
public:
A(T a) {val = a;}
T val() {return val();}
template <typename J>
A<J> cast_as() { return A<J>((J)val); }
};
template <typename T>
class B : public A<T>
{
protected:
int b;
public:
B(T a) : A(a){b=10*a;}
virtual foo() = 0;
//and I'd like, but this can't exist
//template <typename J>
//B<J>* BCastAs();
};
template <typename T>
class C : public B<T>
{
protected:
int c;
public:
C(T c) : B(c) { c=c+1;}
virtual foo() override { cout << (a+b+c);}
};
int main() { C<int> c(10); B<double>* b = c.BCastAs<double>();}
そして、私はそれを行う方法を考えることはできません... B * は実際にそれが C であることを実際に知る必要がないため (クローン呼び出しの戻りと同じように)、それは可能であるように感じますが、私はしません仮想テンプレート メンバー関数を使用せずに c を正しく移動させる方法がわかりませんが、これは不可能です。