C++ 如何创建c++;样板

C++ 如何创建c++;样板,c++,templates,C++,Templates,我目前正在尝试为一个函数编写一个模板专门化,以显示不同值的威力。 我的代码是: #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<&l

我目前正在尝试为一个函数编写一个模板专门化,以显示不同值的威力。 我的代码是:

#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;
}
#包括
使用名称空间std;
样板
T myfunc(T x)
{
返回x*x;
}
样板
字符串myfunc(字符串ss)
{
返回(ss+ss);
}
int main()
{

cout您需要向函数传递字符串,而不是字符数组。请尝试
myfunc(字符串(“测试”))

稍作扩展—调用函数时选择使用哪种模板/模板专业化称为模板参数推断

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

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


另一个解决方法是
myfunc(“test”)
,因为这里直接传递模板参数,而char[]可以隐式转换。

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

稍作扩展—调用函数时选择使用哪种模板/模板专业化称为模板参数推断

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

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


另一个解决方法是
myfunc(“test”)
,因为这里直接传递模板参数,可以隐式转换char[]。

在这种情况下不需要模板专门化,只需重载函数即可:

std::string myfunc(const std::string &ss)
{
    return (ss+ss); 
}
这种方法称它为
myfunct(“test”)
将起作用


有关函数模板专门化通常不可用的所有详细信息,请参阅Herb Sutter的文章

在这种情况下,模板专门化是不必要的,您只需重载函数即可:

std::string myfunc(const std::string &ss)
{
    return (ss+ss); 
}
这种方法称它为
myfunct(“test”)
将起作用

关于为什么函数模板专门化通常不被使用的所有细节,你可以看看Herb Sutter的文章,正如其他人已经说过的那样。 此外,我认为你需要

#include <string>
#包括
其中字符串的运算符+和字符串本身声明 您得到的错误是编译器试图匹配中的所有其他运算符+但失败。

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

#include <string>
#包括
其中字符串的运算符+和字符串本身声明
你得到的错误是你的编译器试图匹配所有其他运算符+而失败。

“test”
不会被推断为
std::string
。它的类型是
const char[5]
“test”
不会被推断为
std::string
。它的类型是
const char[5]
+1,用于包含字符串()构造。“test”被解释为常量字符数组,而不是字符串,因此此调用是必需的。感谢您的明确解释,但不幸的是,它有一个相同的错误。@user3140486为我指定,请尝试#在命名空间+1中缺少“+”运算符的情况下包含字符串()构造。“test”被解释为常量字符数组,而不是字符串,因此此调用是必需的。感谢您的明确解释,但不幸的是,它有一个相同的错误。@user3140486为我指定,请尝试#在名称空间缺少“+”运算符的情况下包含是的,但我认为“测试”的目的是是为了让OP检查参数是如何推导出来的你应该提到std::string有一个const char*的构造函数,它不是显式的,这就是为什么字符串文字会转换成字符串的原因。是的,但我认为“测试”的目的是是为了让OP检查参数是如何推导出来的。您应该提到std::string有一个const char*的构造函数,它不是显式的,这就是为什么字符串文本会转换为字符串的原因。