【发布时间】:2021-11-06 01:48:00
【问题描述】:
我对使用template 和<> 括号和不使用它们的想法有点困惑。当我编译代码时,我得到了我没有预料到的输出,并且没有弄清楚为什么。
例如,假设我有 2 个函数和一个具有相同原型的 template:
using namespace std;
template<typename T> void copy(T a, T b)
{
cout << "template copy" << endl;
}
void copy(int a, int b)
{
cout << "int copy" << endl;
}
void copy(string a, string b)
{
cout << "string copy" << endl;
}
以及编译main函数后:
int main()
{
copy<int>(1, 2);
copy<string>("ha", "ha");
copy("ab", "bc");
copy(1, 2);
return 0;
}
输出如下所示:
template copy
template copy
template copy
int copy
为了记录,所有代码都写在同一个 CPP 文件中。
【问题讨论】:
-
你的代码很糟糕......查看Why is "using namespace std;" considered bad practice?并考虑
std::copy -
编译器将首先选择具有最佳/最显式匹配签名的函数。因此对于字符串和整数,它将首先选择非模板版本。在您的字符串(数字 3)的情况下,它将为 char 数组选择一个模板。
-
第三次调用
copy正在使用copy<const char*> -
对于说我的代码不好的人,这是我在在线编译器上制作的一个简单的快速代码,试图理解这篇文章的问题,当我编码时我不使用 std,我知道这是一个坏习惯:)
-
请注意,
void copy(int, int)不是template <typename T>void copy(T, T)的特化。
标签: c++ templates overload-resolution