【发布时间】:2011-01-24 14:49:05
【问题描述】:
可能重复:
Priority when choosing overloaded template functions in C++
模板化的函数让我可以方便地对各种类型进行操作:
template<typename T> void destroy(T* obj) {
delete obj;
}
但在某些时候,我想对类层次结构进行一些专门化:
class Base { virtual void doSomething(); };
class Derived : public Base {};
void destroy(Base* obj) {
obj->doSomething();
delete obj;
}
如果我传递了确切的类型Base*,则确实调用了预期的专用函数,但是如果我将Derived* 传递给@987654327,重载决议的规则似乎更喜欢通用模板版本而不是执行静态向上转换@。
当然,我可以为所有可能的派生类型创建所有重载函数,但它的可维护性较差。
我使用的是Visual C++ 2008,有什么办法可以解决上述问题吗?
【问题讨论】:
-
刚刚在堆栈溢出中找到了相同问题的简洁答案:Priority when choosing overloaded template functions in C++
-
但是你的销毁函数有问题。它也将被调用为一维数组类型,您可以执行“删除”而不是“删除 []”,这是未定义的行为。
-
Op 承认这个 Q 应该作为副本关闭。
标签: c++ templates resolution class-hierarchy overloading