我有以下代碼:C++:重載不選擇預期的方法
#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);
}
輸出是
- 通用情況
- 通用情況
- 具體情況
爲什麼foo(const A& a)
沒有被選中對於B
對象?
奇怪的是,如果我刪除了模板方法,只是有以下幾點:
#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派生類的自由方法?
是的 - 只有一種方法可以簡化事情。我想我也期待const B&call在這種情況下也會失敗。 – ATemp 2012-03-29 18:57:51
'B'是'A'的直接孩子。它可以綁定到'A&'或'const A&'。 – pmr 2012-03-29 19:01:37
現在我意識到我已經花了31分鐘撰寫我的答案......所以吃了我的時間:x – 2012-03-29 19:22:35