繁体   English   中英

C ++专用功能模板

[英]C++ specialized function template

我开始使用模板,但遇到了问题。 我想将函数sum用作char *类型,但编译失败。

我得到的错误:

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);
}

首先要问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)] = '\0';
    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', '\0'};
char book[5] = {'b', 'o', 'o', 'k', '\0'};
char* raw = sum(face, book);
cout << raw << endl;
delete [] raw; // Remember you need to delete the heap that sum() grabbed.

输出:

12
Facebook

这个例子当然很粗糙,不是您想要在重要代码中做的事情。 我假设这只是一种练习,因为以这种方式专门化并不会增加任何特定的值,当然,这已经在标准库中以不同的方式实现。

您不能return *a+*b ,甚至不能return *a 你可以retun a (参见同比返回类型)

如果要添加两个字符串,则编写如下函数:

char* sum(char* a, char* b){
    char * ret = (char *) malloc(1 + strlen(a)+ strlen(b) );
    strcpy(ret, a);
    strcat(ret, b);
    return ret;
}

此问题与模板无关,代码中的问题:

char* sum(char* a, char* b) {
    return (*a + *b);
}

因为(* a)的类型是char(不是char *),所以(* a + * b)的类型是int(在算术中自动转换为int),并且int无法转换为返回类型的“ char *”值。

假设sum表示char *数据类型的串联,那么您的代码应如下所示:

char* sum(char* a, char* b){
    char *ret = a;
    strcat(ret,b);
    return ret;
}

由于+运算符不会对char *重载,如果您有选择,则应使用字符串代替char *

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM