关于友元函数声明问题

colorfulcode 2011-09-17 10:33:31
在看C++ Templates时产生了一个疑问

template<typename T>
void multiply(T a)
{

}

class Test
{
public:
friend void multiply(Test &a);
};


Test a;
multiply(a); // 产生链接错误

对于上面代码的错误,书上说,如果Test中的multiply不是受限的,那么该名称一定不是引用一个模板实例

为什么?
是不是因为没有“::”或尖括号限制时,默认将multiply当成普通函数,而非模板,而又因为模板的等级低,于是才出现上述情况?
...全文
145 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
星羽 2011-09-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 colorfulcode 的回复:]

to 4:

书上也说了,加上尖括号就OK了,但我就是闹不明白,没有尖括号时怎么解释
[/Quote]

帮你google篇文章
colorfulcode 2011-09-17
  • 打赏
  • 举报
回复
to 4:

书上也说了,加上尖括号就OK了,但我就是闹不明白,没有尖括号时怎么解释
colorfulcode 2011-09-17
  • 打赏
  • 举报
回复
那,我的那个又该怎么解释呢
星羽 2011-09-17
  • 打赏
  • 举报
回复
你这种写法是合法的,但也是隐晦的,好像有少数编译器可以支持,记得EDG, Intel的应该可以

要让大部分编译器都通过,这么写吧



template<typename T>
void multiply(T a)
{

}

class Test
{
public :
friend void multiply<>(Test& a);
};


int main()
{
Test a;
multiply(a);

return 0;
}
pathuang68 2011-09-17
  • 打赏
  • 举报
回复
严格地,应该这么写:

#include <iostream>
using namespace std;

template<typename T>
class Test
{

public:
template<typename T>
friend void multiply(Test &a);
};

template<typename T>
void multiply(T a)
{
//cout << "Fun" << endl;
//此处可以实现你自己想要实现的功能
}

int main(void)
{
Test<int> t;
multiply(t);

return 0;
}
colorfulcode 2011-09-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 pathuang68 的回复:]

在类中如下声明友元函数试试:
C/C++ code

template<typename T>
friend void multiply(T a)
{

}
[/Quote]

这个是没问题
pathuang68 2011-09-17
  • 打赏
  • 举报
回复
在类中如下声明友元函数试试:

template<typename T>
friend void multiply(T a)
{

}

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧