我有一个指针类的子集,它看起来像:C++模板和模糊问题
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>
,另一个需要Pointer<BaseClass>
,并且我尝试用Pointer<SubClass>
来调用它,但是我在两个重载之间产生了一个模糊性,目的是,后者的重载将被称为。
有什么建议吗? (希望我是足够清晰的)
这是更为常见的使用大写字母'U'额外的模板参数。小写't'几乎看起来像一个错字。 – GManNickG 2009-12-13 21:43:57
隐式转换是一个坏主意。使用'T * get()'而不是'运算符T *()'。 shared_ptr做这样的事情。 – 2009-12-13 21:49:38