我有一个指针类的子集,如下所示:
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 *
。此实际规则仅由构造函数的定义强制执行,编译器无法仅通过声明来确定它。如果我放弃它,并尝试将 a 传递Pointer<Sub>
给 的构造函数Pointer<Base>
,我会得到一个编译错误,尽管可能通过operator T *()
.
虽然它解决了上述问题,但它创造了另一个问题。如果我有一个重载函数,其一个重载采用 a Pointer<UnrelatedClass>
,另一个采用Pointer<BaseClass>
,并且我尝试使用 a 调用它Pointer<SubClass>
,我会在两个重载之间产生歧义,当然,目的是调用后一个重载。
有什么建议么?(希望我足够清楚)