c++函数模板替代函数编写
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
template<class T>
T myfunc(T a,T b){
T c=a+b;
return c;
}
string myfunc( string a,string b){
string c=a+b;
return c;
}
int main(){
int c;
float d;
c=myfunc(3,4);
cout<<c<<endl;
d=myfunc(3.4,4.7);
cout<<d<<endl;
string e=myfunc("aa","bbb");
cout<<e<<endl;
system("pause");
return 0;
}
编译器报错:cannot add two pointers
不明白为什么,哪位大侠帮解决一下,不胜感激!
参考答案:一楼的很有意思,你这篇文章其实是很经典的,但与本问题无关...
问题在这一句:
string e = myfunc("aa", "bbb");
编译器已经很明确地告诉你了,不能把2个指针相加,因为在用双引号括起来的字符都是所谓的C风格字符串,即以一个指针来标明其首个字符并以'/0'作为结束信号的字符串,比如:
const char* p = "hello, world!";
如果你将其打出,如:
cout << p;
则指针p便会把其指向的字符逐个打印出来,再遇到'\0'时结束。
在你的问题中,由于"aa"和"bbb"无法被转化为string类,所以编译器不会调用这个函数:
string myfunc(string a, string b)
{
string c = a + b;
return c;
}
而是为它们生成了特定的模版:
char* myfunc(char* a, char* b);
由于两个指针的相加是没有被定义的,所以编译器报错。
由于string e = myfunc("aa", "bbb")中的"aa"和"bbb"被默认作为了C风格的字符串,而编译器没有定义一种隐式的转换方法可以把C风格字符串转化为string类,所以你必须通过显式地把它们转换为string类字符串,可以这样:
string e = myfunc(string("aa"),string("bbb"));
或者用更加一目了然且安全但烦琐而冗长的C++式cast句法:
string e = myfunc(static_cast<string>("aa"), static_cast<string>("bbb"));
另外说下用了模版的话你的这个函数就可以砍掉了:
string myfunc(string a, string b)
{
string c = a + b;
return c;
}
另外如果你不想烦琐地每次调用myfunc来实现2个字符的相加都要通过cast的话也可以把myfunc模板实例化:
#include <iostream>
#include <string>
#include <cmath>
#include <cstring>
using namespace std;
template<class T>
T myfunc(T a,T b){
T c=a+b;
return c;
}
// 模板实例化
template<> const char* myfunc<const char*>(const char* a, const char* b)
{
string temp = string(a) + string(b);
return temp.c_str(); // 结果可能出乎你的预料~
}
// 或者
// 模板实例化
/* template<> const char* myfunc<const char*>(const char* a, const char* b)
{
char* pa = new char[sizeof a + sizeof b];
const char* pc = strcat(strcpy(pa, a), b);
delete [] pa;
return pc; // 同上
}*/
int main(){
int c;
float d;
c=myfunc(3,4);
cout<<c<<endl;
d=myfunc(3.4,4.7);
cout<<d<<endl;
string e=myfunc("aa","bbb");
cout<<e<<endl;
system("pause");
return 0;
}
你运行这个程序得到的e可能是乱码,原因可见一楼的部分提示:
8. 不要再写 char* p = "XXX" 这种语句,要写成 const char* p = "XXX",编译器之所以让前者通过编译是为了兼容以前的大量的旧代码。
BTW:const TYPE* p 和 TYPE const* p 是一样的,风格不同而已。
BTW:C语言中也有const关键字。
详细可见: