C++ 专用函数模板
C++ specialized function template
我开始使用模板时遇到了问题。我想对 char* 类型使用函数 sum,但编译失败。
我得到的错误:
cannot initialize return object of type 'char*' with an rvalue of type 'int'
代码:
#include <iostream>
using namespace std;
template<class T>
T sum(const T a, const T b){
return (a+b);
}
char* sum(char* a, char* b){
return (*a + *b);
}
此问题与模板无关,代码问题:
char* sum(char* a, char* b) {
return (*a + *b);
}
因为 (*a) 的类型是 char(不是 char*),(*a + *b) 的类型是 int(在算术上自动转换为 int)并且 int 无法转换为 "char *" 即 return 值的类型。
假设 sum 表示 char* 数据类型的串联,那么您的代码应该如下所示:
char* sum(char* a, char* b){
char *ret = a;
strcat(ret,b);
return ret;
}
因为 char* 没有重载 + 运算符,如果您有选择,则应使用字符串而不是 char*
你不能 return *a+*b
,甚至 return *a
也不行;你可以retun a
(看你return类型)
如果你想添加两个字符串然后写这样的函数 -
char* sum(char* a, char* b){
char * ret = (char *) malloc(1 + strlen(a)+ strlen(b) );
strcpy(ret, a);
strcat(ret, b);
return ret;
}
首先问 sum(char* a, char* b)
是做什么的?参数是字符串,不是数字所以可能操作应该连接两个字符串?写一些东西来实现这个:
char* sum(char* a, char* b){
char* sum = new char[ strlen(a) + strlen(b) + 1 ];
memcpy(sum, a, strlen(a));
memcpy(sum + strlen(a), b, strlen(b));
sum[strlen(a) + strlen(b)] = '[=10=]';
return sum;
}
现在,如果您认为它增加了价值,您可以专门化 sum
模板函数,使其执行您想要的操作。即
template<>
char* sum<char*>(char* a, char* b){
...
现在您可以这样做了:
int c = sum(5, 7);
cout << c << endl;
char face[5] = {'F', 'a', 'c', 'e', '[=12=]'};
char book[5] = {'b', 'o', 'o', 'k', '[=12=]'};
char* raw = sum(face, book);
cout << raw << endl;
delete [] raw; // Remember you need to delete the heap that sum() grabbed.
输出:
12
Facebook
这个例子当然很粗糙,不是你想在重要代码中做的事情。我假设这只是一个练习,因为以这种方式专门化不会增加任何特定的价值,当然,这已经在标准库中以不同的方式实现了。
我开始使用模板时遇到了问题。我想对 char* 类型使用函数 sum,但编译失败。
我得到的错误:
cannot initialize return object of type 'char*' with an rvalue of type 'int'
代码:
#include <iostream>
using namespace std;
template<class T>
T sum(const T a, const T b){
return (a+b);
}
char* sum(char* a, char* b){
return (*a + *b);
}
此问题与模板无关,代码问题:
char* sum(char* a, char* b) {
return (*a + *b);
}
因为 (*a) 的类型是 char(不是 char*),(*a + *b) 的类型是 int(在算术上自动转换为 int)并且 int 无法转换为 "char *" 即 return 值的类型。
假设 sum 表示 char* 数据类型的串联,那么您的代码应该如下所示:
char* sum(char* a, char* b){
char *ret = a;
strcat(ret,b);
return ret;
}
因为 char* 没有重载 + 运算符,如果您有选择,则应使用字符串而不是 char*
你不能 return *a+*b
,甚至 return *a
也不行;你可以retun a
(看你return类型)
如果你想添加两个字符串然后写这样的函数 -
char* sum(char* a, char* b){
char * ret = (char *) malloc(1 + strlen(a)+ strlen(b) );
strcpy(ret, a);
strcat(ret, b);
return ret;
}
首先问 sum(char* a, char* b)
是做什么的?参数是字符串,不是数字所以可能操作应该连接两个字符串?写一些东西来实现这个:
char* sum(char* a, char* b){
char* sum = new char[ strlen(a) + strlen(b) + 1 ];
memcpy(sum, a, strlen(a));
memcpy(sum + strlen(a), b, strlen(b));
sum[strlen(a) + strlen(b)] = '[=10=]';
return sum;
}
现在,如果您认为它增加了价值,您可以专门化 sum
模板函数,使其执行您想要的操作。即
template<>
char* sum<char*>(char* a, char* b){
...
现在您可以这样做了:
int c = sum(5, 7);
cout << c << endl;
char face[5] = {'F', 'a', 'c', 'e', '[=12=]'};
char book[5] = {'b', 'o', 'o', 'k', '[=12=]'};
char* raw = sum(face, book);
cout << raw << endl;
delete [] raw; // Remember you need to delete the heap that sum() grabbed.
输出:
12
Facebook
这个例子当然很粗糙,不是你想在重要代码中做的事情。我假设这只是一个练习,因为以这种方式专门化不会增加任何特定的价值,当然,这已经在标准库中以不同的方式实现了。