次のようなポインタクラスのサブセットがあります。
template <typename T>
struct Pointer
{
Pointer();
Pointer(T *const x);
Pointer(const Pointer &x);
template <typename t>
Pointer(const Pointer<t> &x);
operator T *() const;
};
最後のコンストラクターの目標はPointer
、サブクラスの、または基本的に暗黙的にに変換可能な任意の型を渡すことができるようにすることT *
です。この実際のルールは、コンストラクターの定義によってのみ適用され、コンパイラーは宣言だけで実際にそれを理解することはできません。Pointer<Sub>
それを削除し、のコンストラクターにを渡そうとすると、パスを通過するPointer<Base>
可能性があるにもかかわらず、コンパイルエラーが発生しますoperator T *()
。
上記の問題を解決しながら、別の問題を作成します。Pointer<UnrelatedClass>
一方のオーバーロードがaを取り、もう一方がをとるオーバーロードされた関数があり、それPointer<BaseClass>
をで呼び出そうとするとPointer<SubClass>
、もちろん、後者のオーバーロードが呼び出されることを意図して、2つのオーバーロードの間にあいまいさが生じます。
助言がありますか?(うまくいけば、私は十分に明確でした)