2

代码如下:

template <class InputIterator, class OutputIterator>
inline OutputIterator copy(InputIterator first, InputIterator last,
                           OutputIterator result)
{
  return __copy_dispatch<InputIterator,OutputIterator>()(first, last, result);
}

//A overload version
inline char* copy(const char* first, const char* last, char* result) {
  memmove(result, first, last - first);
  return result + (last - first);
}

如果我调用copy(int*, int*),这是最佳匹配,编译器将实例化一个新函数int*用作模板参数,还是int*将转换为char*.

如果我调用copy(char[], char[])通知,我只是char[]用来记录参数的类型。

4

2 回答 2

3

由于int *不能隐式转换为char *or const char *,因此将调用模板函数。删除模板函数会导致编译时错误。

建议:自己玩转编译器很有价值。您可以添加如下行

std::cout << "template function called.\n";

进入你的重载或使用调试器来做那种事情。这是一次很棒的学习经历。您也可以简单地阅读一些 C++ 书籍来进行介绍。

于 2013-06-21T07:09:44.040 回答
1

如果我调用 copy(int*, int*),这是最好的匹配,

只有一个匹配:模板。版本const char*完全不匹配。

如果我调用 copy(char[], char[])

再次,模板获胜,因为参数不是const. 如果你这样做:

const char* c1 = ....;
const char* c2 = ....;
copy(c1, c2);

那么非模板将获胜,因为在完美重载匹配的情况下,非模板函数优先。

于 2013-06-21T07:17:28.317 回答