如何创建c++模板

how create c++ Template?

本文关键字:c++ 模板 创建 何创建      更新时间:2023-10-16

我目前正试图为一个显示不同值的强大功能的函数编写一个模板专用化。我的代码是:

#include <iostream>
using namespace std;
template <class T>
T myfunc(T x)
{
return x*x;
}
template<>
string myfunc<string>(string ss)
{
return (ss+ss); 
}
int main()
{
cout<<myfunc("test")<<endl;
return 0;
}

编译失败:

错误C2784:'std::_String_iterator&lt_Mystr>std::运算符+(_String_iterator<_Mystr>::difference_type,std::_String_iterator<_Mystr>)':无法推导的模板参数'std::_String_iterator&lt_Mystr>'from'std::string'

你能帮我检测问题的确切位置吗?

您需要向函数传递字符串,而不是char数组。尝试myfunc(string("test"))

稍微扩展一下——当调用函数时,选择使用哪个模板/模板专业化被称为模板参数推导。

您希望调用myfunc,但是测试类型是char[5](末尾为null字符)。因此,模板参数被"推导"为char[5]。

通常,在对完全专业化函数(而不是模板函数)的调用中,char[]可以隐式转换为字符串(我认为这是不推荐的)。这种隐式强制转换是因为,正如user1274223所指出的,std::string有一个带有签名字符串(const char*)的构造函数,而这个构造函数是而非显式!当我们想假装c字符串(char*)很容易与cplusplus字符串(std::string)互换时,这很有帮助,但在这些类型的情况下可能会令人困惑。

另一个解决方案是myfunc<string>("test"),因为这里直接传递模板参数,char[]可以隐式地强制转换。

在这种情况下,模板专业化是不必要的,您应该重载函数:

std::string myfunc(const std::string &ss)
{
return (ss+ss); 
}

这样将其称为myfunct("test")就可以了。

关于为什么函数模板专业化通常不有用的所有细节,你可以看看Herb Sutter的文章《为什么不专业化函数模板?

正如其他人所说。此外,我认为你需要

#include <string>

其中字符串的运算符+和字符串本身声明你得到的错误是你的编译器试图匹配所有其他运算符+in,但失败了。