如何创建c++模板
how create c++ Template?
我目前正试图为一个显示不同值的强大功能的函数编写一个模板专用化。我的代码是:
#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<_Mystr>std::运算符+(_String_iterator<_Mystr>::difference_type,std::_String_iterator<_Mystr>)':无法推导的模板参数'std::_String_iterator<_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,但失败了。
- .cpp和.h文件中的模板专用化声明
- C++模板来检查友元函数的存在
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 如何在c++中为模板函数实例创建快捷方式
- 使用C++中的模板和运算符重载执行矩阵运算
- 有人能分解一下这个c++模板的语法吗
- 如何在c++17中制作一个模板包装器/装饰器
- 模板化建造师专业化
- 调用专用模板时出错"no matching function for call to [...]"
- 模板元程序查找相似的连续类型名称
- 如何在C++20中创建模板别名的推导指南
- 没有名称的C++模板参数
- 具有重复类型的C++可变模板
- 如何将enable-if与模板参数和参数包一起使用
- 没有用于初始化C++中的变量模板的匹配构造函数