【发布时间】:2009-12-13 21:32:19
【问题描述】:
我有一个指针类的子集,如下所示:
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几乎看起来像是一个错字。 -
隐式转换是个坏主意。使用
T * get()而不是operator T*()。 shared_ptr 做这样的事情。
标签: c++ templates ambiguity implicit-conversion ambiguous-call