【发布时间】:2012-03-29 18:47:32
【问题描述】:
我有以下代码:
#include <iostream>
#include <vector>
using namespace std;
struct A{};
struct B: public A {};
template <typename T>
void foo(const T& obj) { cerr << "Generic case"<< endl;}
void foo(const A& a) {
cerr << "Specific case" << endl;
}
int main() {
vector<int> v;
foo(v);
B b;
foo(b);
A a;
foo(a);
}
输出是
- 一般情况
- 一般情况
- 具体情况
为什么没有为B 对象选择foo(const A& a)?
奇怪的是,如果我删除了模板化的方法,只剩下以下内容:
#include <iostream>
#include <vector>
struct A{};
struct B: public A {};
//template <typename T>
//void foo(const T& obj) { cerr << "Generic case"<< endl;}
void foo(const A& a) {
cerr << "Specific case" << endl;
}
int main() {
B b;
foo(b);
A a;
foo(a);
}
代码编译,输出为:
Specific case
Specific case
为什么模板化方法的存在会产生如此大的影响?
编辑:如何强制编译器在存在的情况下为从 A 派生的类选择免费方法 模板化方法?
【问题讨论】:
标签: c++ templates inheritance overloading