欢迎加入【企鹅之家交流群】,交流建站经验,共享热门影视资源,分享网赚经验。

定义模板友元函数中出现的问题

问题:

我在实现一个链式栈模板类的时候,需要重载<<函数,以输出栈的节点数据,因此,必须将其定义为友元函数,否则,因为ostream并不是linkedstack<T>;类的对象会报错。然而最后测试的时候出现了这样一个错误:undefined reference to `operator<<(std::ostream&, LinkedStack<int> const&)',没有被定义,但是我确实定义了ostream& operator <<(ostream& output,const LinkedStack<T>& sta);我将友元函数修改为ostream& operator <<(ostream& output,const LinkedStack<int>& sta),相应的修改了函数内部的T,这个时候编译通过了,如果定义linkedstack<char>型的变量的话又会报错undefined reference to `operator<<(std::ostream&, LinkedStack<char> const&)';这个时候问题就很明显了!

分析:

因为友元函数并不是一个模板函数,而是一个参数带有模板的函数,当我们定义一个linkedstack<char>的变量时,它会自动调用参数为linkedstack<char>的友元函数,而我们并没有定义,我们只是定义了参数为linkedstack<T>的友元函数,它并不能被具体化地表示为linkedstack<char>;所以我们应该将友元函数定义为模板函数,这样友元函数就会自动的根据参数类型来具体化了;

解决:

将友元函数定义为template<class CT>friend ostream& operator<<(ostream& output,const LinkedStack<CT>& sta);注意这时候的参数类型不能为T,因为T在stack中已经定义过了;

源码:

GitHub源码查看
若无特别说明,本站所有文章均为企鹅之家原创,为了尊重站长的劳动成果,转载请注明本文固定链接:http://qiezhijia.wang/ding_yi_mo_ban_you_yuan_han_shu_zhong_chu_xian_de_wen_ti/良好的网络环境由你我共创!
喜欢 (1)or分享 (0)

您必须 登录 才能发表评论!