1楼:折柳成萌
你说的不是模板的具体化,而是模板的
特化或者偏特化,在这道题里就是模板的特化。
比如#include
#include
using namespace std;
const int lim=5;
template
t maxn(t a,int n)
int main()
,a1;
double b[4]=,b1;
a1=maxn(a,6);
b1=maxn(b,4);
string ss = ;
string str = maxn(ss, 10);
cout< cout< cout << str << endl; system("pause"); return 0;} c++ 模板类具体化
100 2楼:gta小鸡 最简单的做法是在模板类中定义一个同名的重载函数swap(char* &a, char* &b);。编译器的原则是先匹配具体函数后匹配模板函数,所以当t为char*类型时会调用该swap函数而不是模板swap函数。 3楼:匿名用户 首先这叫特例化,不叫具体化... 你说具体化我一直以为你要实例化... 你完全可以另外提供比较的功能,而不是直接把比较写到sort里面去。 函数模板的具体化有什么意义吗?? 4楼:平填真杯具平男 比如,你定义了一个函数模板 template void func(const t& t)但是,当t是整数的时候你不想dosomething,而是想killsomeone,那就需要具体化了。 具体化有2种形式,一种是显式具体化 即定义一个特殊类型的实现 template<> void func(const int& t)这样,除了int型以外,其他类型仍然按照dosomething来运行另一种方式是写一个函数来屏蔽模板 比如,定义如下 void func(const int& t)这样,在编译链接时这个函数就屏蔽掉了模板,自动采用定义的函数。 以上就是函数模板具体化的作用和方法,如有不明白,可继续追问 5楼:匿名用户 就是确定了参数类型,用该类型替换函数模板里的模板参数,生成能够处理该类型的函数**,即模板函数。 总之一句话,就是将模板具体成某一类型参数的具体函数 c++函数模板 6楼: struct box ;template<> const box& swap(const box& b1,const box& b2); 你应该把类型定义放到显示模板声明前面。 这段**我运行了没有运行错误,你出现了什么问题? 7楼:匿名用户 需要把 box 结构声明放在函数模板显示具体化上面,这样函数模板显示具体化才能识别这个类型。 c++函数模版显示具体化问题
20 8楼:匿名用户 typedef char* t; const t x; 显然这个声明表示 x 的值不可以修改。换言之 x 的类型是 char * const 而不是 const char * ,如果 x 的类型是 const char * 的话 x 的值就可以更改了(*x 能不能修改?那关我什么事) 这个例子就说明如果 t 表示 char* 那么 const t 肯定就表示 char * const,否则c++就含有自相矛盾的规则了。也许写成 t const 更好一点 既然参数不是 const char*,返回也就不应该是 const char* 如果 t 表示 const char * 的话,返回就是 const char*。下面的特化是合法的: template <>const char * search_max(const char * const a , int n); 你好,这里时你在2013年4月份回答的知友的一个关于c++函数模板的问题,关于**有两个问题救助 9楼:单身向右 其实形参为char *const 我觉得是不合理的。这样的结果是,你形参数组的指针不能改变指向,完全没有意义,因为即使你在函数内部修改了指向也不会改变其调用对象的指针指向。相反,你却可以通过指针修改指针指向的内容,这和你设计的初衷相矛盾了吧?? 设计的初衷应该是,不能修改指针指向的内容,而不是不能修改指针的指向。而且还造成了下面的问题,也就是你问的为什么要使用char **进行强制类型转换的原因,见解释2。如果将形参改为const char *是更加的合理,这样就可以使用常对象作为该模板的参数。 其次,对于编译器而言,你将一个非const对象传递给const形参是类型安全的,但是你将一个const对象传递给非const形参是非类型安全的。你说的强制类型转换(char **)是将const对象强制转换为非const对象。因此,你将const char *传递给char *const是不安全的,编译器会报错。 const char *是说模板类t是const的,但是char *const的模板t不是const,因此你不能讲const传递给非const。同理,你将int传递给double类形参也是不安全的,你将double传递给int是安全的,这都是一个道理。你记住一句换,将大的类型隐式传递给小的类型是安全的,反过来就是非安全的。 这个也适用于继承上的基类和子类。你将子类对象直接赋值给基类指针是ok的,但是你不能隐式的将基类对象赋值给子类指针。如果你一定要将小的类型赋值给大的类型,你可以有3种方法: 使用c风格的强制类型转换,使用interpret_cast进行类型的重解释,使用静态类型转换static_cast,我不知道dynamic_cast行不行。 c++ 函数模板形参的问题 10楼: 任何非“指向常量的指针”在这种情况下都是引用,你可以把这类指针看成是数组,你也最好当char*是char,因为这里正是以数据引用来传递,这里t的类型是char[6]。数组之间不能转换,但凡是转换都有复制。 其实,你这个程序不能在一个严格遵守c++规定的编译器中编译通过,不能从const char*到char*的转换,"abc"的类型是const char* 11楼:匿名用户 没有理解楼主想表达什么意思,不过还是跟你学习了,呵呵: #include using std::cin; using std::cout; using std::endl; template void f(t* const pt) 12楼:匿名用户 这得问编译器啦。不过你这模板本来就是不规范有歧义的啦。 比如若输出reference 就是f(str)和f(p) 若输出point 则是f(str)和f(p) 这与你输入参数是不是指针应该没啥关系,就看编译器怎么认了 关于c++函数模板与实例化 13楼:匿名用户 有一个函数是void func(int*(int&, int&)),这是表示func的形参是一个指向一个函数的指针? 应该是它的参数是个函数指针吧。 晕 。。。才发现你后面自己懂了。。。。 c++ 模板具体化 14楼:匿名用户 你说的不是模板的具体化,而是模板的特化或者偏特化,在这道题里就是模板的特化。 比如#include #include usingnamespacestd; constintlim=5; template tmaxn(ta,intn) intmain() ,a1; doubleb[4]=,b1; a1=maxn(a,6); b1=maxn(b,4); stringss=; stringstr=maxn(ss,10); cout< 当然我的特化不是针对你的题目的,只是随便举了个例子如果还有不懂的地方,建议看c++ primaer的“模板与泛型编程”那一章,讲解很详细。 15楼:匿名用户 具体化时,模板函数会根据你所传参数的类型来匹配t类型,就是说你传的参数类型会在模板函数中替代t 1楼 gta小鸡 最简单的做法是在模板类中定义一个同名的重载函数swap char a char b 。编译器的原则是先匹配具体函数后匹配模板函数,所以当t为char 类型时会调用该swap函数而不是模板swap函数。 2楼 匿名用户 首先这叫特例化,不叫具体化 你说具体化我一直以为你要实例化 你完... 1楼 匿名用户 template void fun a a template void fun int a 显式具体化void main 谁能帮我解释下c 函数模板显示实例化? 2楼 物理公司的 template void fun a a template void fun int a 显式具体化v... 1楼 匿名用户 include include using namespace std template void maxn t ar int n templatevoid maxn t ar int n 我这个显示具体化错在 啊?模板型参类表不能为空 int main double tr 4 st...c类具体化,c++ 模板类具体化
100
C++函数的显示实例化和显式具体化是什么。?解释下这个
C++中函数显示具体化问题大家快来看看啊(跪求答案)