以下代码:
#include <iostream>
using std::cout; using std::endl;
template <typename T>
int compare(const T&, const T&) {
cout << __PRETTY_FUNCTION__ << endl;
return 0;
}
template <size_t N, size_t M>
int compare(const char (&)[N], const char (&)[M]) {
cout << __PRETTY_FUNCTION__ << endl;
return 0;
}
int main(int argc, char *argv[]) {
compare("hi", "is");
}
当我用g++ -std=c++1y
编译代码时,它会抱怨:
error: call of overloaded ‘compare(const char [3], const char [3])’ is ambiguous
compare("hi", "is");
根据模板重载的规则,可行的功能是:
compare(const T&, const T&) with T = char [3]
compare(const char (&)[N], const char (&)[M]) with N = 3ul, M = 3ul
它们都提供与呼叫同样好(即精确)的匹配。所以我应该检查哪一个更专业。
但根据我的有限知识,const T&
比const char (&)[N]
更为通用。所以我认为compare(const char (&)[N], const char (&)[M])
更专业。但为什么这个电话含糊不清?
答案 0 :(得分:10)
第一个重载return this.http.get('something/1')
.switchMap(res1 => {
// use res1 if you need it
return this.http.get('something/2')
})
.switchMap(res2 => {
// use res2 if you need it
return this.http.get('something/3')
})
.subscribe(res3 => {
// use the final response
console.log(res3)
})
强制两个参数都是相同的类型,而第二个重载则不是。所以在这方面,第一次过载更具体。
但是,第二次重载会强制两个参数都为compare(const T&, const T&)
数组,所以在这方面更具体。
因此,任何一个过载都不能说比另一个更专业,结果就是模糊错误。
另一种看待它的方法是每个重载都可以接受另一个不输入的输入:只有第一个重载接受一个调用,其中两个参数都是char
。并且只有第二个重载将接受调用,其中参数为int&
和char (&)[2]
。
如果您将第二个重载更改为
char (&)[3]
它将修复错误,因为这现在严格地比第一次重载更具体。