私は次の不自然な例を持っています(実際のコードから来ています):
template <class T>
class Base {
public:
Base(int a):x(a) {}
Base(Base<T> * &other) { }
virtual ~Base() {}
private:
int x;
};
template <class T>
class Derived:public Base<T>{
public:
Derived(int x):Base<T>(x) {}
Derived(Derived<T>* &other): Base<T>(other) {}
};
int main() {
Derived<int> *x=new Derived<int>(1);
Derived<int> y(x);
}
これをコンパイルしようとすると、次のようになります。
1X.cc: In constructor ‘Derived<T>::Derived(Derived<T>*&) [with T = int]’:
1X.cc:27: instantiated from here
1X.cc:20: error: invalid conversion from ‘Derived<int>*’ to ‘int’
1X.cc:20: error: initializing argument 1 of ‘Base<T>::Base(int) [with T = int]’
1)明らかにgccはコンストラクターによって混乱されています。コンストラクターから参照を削除すると、コードがコンパイルされます。だから私の仮定は、ポインタ参照のアップキャストで何かがうまくいかないということです。誰かがここで何が起こっているのか教えてもらえますか?
2)少し関係のない質問。コンストラクターで「他を削除」のような恐ろしいことをした場合(私と一緒に)、誰かがスタック上の何かへのポインターを私に渡した場合はどうなりますか?
E.g. Derived<int> x(2);
Derived<int> y(x);
where
Derived(Derived<T>*& other) { delete other;}
ポインタがヒープ上の何かを合法的に指していることを確認するにはどうすればよいですか?