C ++专用函数模板

时间:2017-05-15 10:31:36

标签: c++ templates template-specialization

我开始使用模板,但我遇到了问题。我想将函数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);
}

4 个答案:

答案 0 :(得分:3)

首先询问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

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

答案 1 :(得分:2)

你不能return *a+*b,甚至不能return *a;你可以retun a(见yoy返回类型)

如果你想添加两个字符串,那么写这样的函数 -

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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:1)

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

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

由于+运算符没有为char *重载,如果你有选项,那么应该使用string而不是char *