模板和函数重载

时间:2012-11-25 20:09:07

标签: c++ templates overloading

为了研究功能模板的重载,我写了两个函数:

template <typename T>
void pe16_61_compare(const T&, const T&) {
    cout <<"template pe16_61_compare(T, T) called" << endl;
}

// plain functions to handle C-style character strings
void pe16_61_compare(const char*, const char*) {
    cout <<"normal func pe16_61_compare(...) called" << endl;;
}

然后我定义了一些变量并调用了函数:pe16_61_compare

const char const_arr1[] = "world", const_arr2[] = "hi";
char ch_arr1[] = "world";
// first call
pe16_61_compare(ch_arr1, const_arr1);
// second call
pe16_61_compare(const_arr1, const_arr2);

输出结果为:

template pe16_61_compare(T, T) called
normal func pe16_61_compare(...) called

让我感到困惑的是,第一个调用调用了模板函数。对我来说,对于第一次调用,两个pe16_61_compare函数都是可行的函数,并且具有相同的转换等级(非const到const和数组到指针),并且在这种情况下,应该从模板函数中删除模板函数可行的功能集。

有谁可以告诉我为什么? 感谢您考虑我的问题!

1 个答案:

答案 0 :(得分:3)

对于第一次通话,T = char[6]与转换为char const *的匹配度更高,因此模板获胜。

对于第二次调用,没有单个模板参数可以用于数组,因此非模板重载是唯一匹配的。

如果你说,

pe16_61_compare(static_cast<char const *>(const_arr_1),
                static_cast<char const *>(const_arr_2));

然后模板实例和普通函数都是可行的并具有相同的签名,但作为一个平局破坏者,非模板函数获胜(即这不是模棱两可的)。