使用参数(const T&,const T&)或(const char(&)[N],const char(&)[M])重载模板的模糊调用

时间:2017-09-24 11:33:25

标签: c++ c++11 templates overloading

以下代码:

#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])更专业。但为什么这个电话含糊不清?

1 个答案:

答案 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]

它将修复错误,因为这现在严格地比第一次重载更具体。