【发布时间】:2014-09-23 17:04:59
【问题描述】:
我正在为我的一门课程做模板专业化,我遇到了一些意想不到的事情..
这是我的代码:
class Base {};
class Derived : public Base {};
template<typename T>
void doSomething(T t) { cout << "All Types!" << endl; }
template<>
void doSomething(Base b) { cout << "Base!" << endl; }
int main() {
Derived d;
doSomething(d); //prints "All Types!"
return 0;
}
我有一个模板函数 doSomething(T),它接受任何类型的参数.. 除了类型基类。
所以我将 doSomething 模板专门用于 Base 类型的参数,所以它做了一些不同的事情。
但是,当我将 Derived 类传递给 doSomething 时,它会打印“All Types!”,而我希望它会打印“Base!”,因为 Derived 类本质上也是 Base 类。
为什么这个专业化不适用于 Derived?
有什么办法让它工作?
谢谢
更新:
有人提到覆盖而不是模板专业化..但是在这种情况下我将如何覆盖函数?
如果我有:
template<typename T>
void doSomething(T t) { cout << "All Types!" << endl; }
void doSomething(Base b) { cout << "Base!" << endl; }
然后 doSomething(d) 也会打印“所有类型!”而不是“Base!”,因为 Derived2 对象将被简单地视为类型模板参数
【问题讨论】:
-
第 1 步:停止专门化功能。改为覆盖。压倒性和专业化以令人讨厌的方式交互。然后考虑覆盖。
-
@Yakk 请看我的更新
-
你真的打算对你的 Derived 对象进行切片吗?
-
@n.m 我认为这对我来说并不重要。我只希望函数重载/专业化工作..
-
它是否真的适用于 Base 对象本身?