cygwin + 友元 + 模板特化?顺便散分

i_noname 2006-11-27 03:00:47
#include <string>
#include <iostream>

namespace space
{
template <class T>
void show(const T&);
};

class myclass
{
public:
myclass() : name("myname") {}
private:
std::string name;
friend void space::show<myclass>(const myclass&);
};

namespace space
{
template<>
void show<myclass>(const myclass& obj)
{
std::cout << obj.name << std::endl;
}
}

int main()
{
myclass a;
space::show(a);

return 0;
}

Linux下gcc 4.1.1编译通过,但cygwin下gcc 3.4.4就不行,报错:
error : 'void space::show(const myclass &)' should have been declared inside 'space'
请大家给出一个cygwin下能通过的修改方案
...全文
165 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiandao82 2006-11-27
  • 打赏
  • 举报
回复
因为默认的console程序不开启多线程调试,
Vs2003项目属性,c/C++中的代码生成库中选择多线程序dug就可以开启了,自然就通过了.
ming4098 2006-11-27
  • 打赏
  • 举报
回复
接分
i_noname 2006-11-27
  • 打赏
  • 举报
回复
taodm(taodm)说得真好,50分归你了
剩下50分散给大家
4点结
  • 打赏
  • 举报
回复
exceptional中有说道这个问题
改过之后也过不去 俺的gcc是3.4.5
taodm 2006-11-27
  • 打赏
  • 举报
回复
看hurb sutter的“Befriending Templates”
指导原则:显式地表明你的意图。当你申明函数模板的一个特化版本为友元时,总是显式加上至少一对“<>”模板符号。 举例来说是:

namespace boost {
template<typename T> void checked_delete( T* x );
}
class Test {
friend void boost::checked_delete ( Test* x ); // BAD
friend void boost::checked_delete<>( Test* x ); // GOOD
};

如果你的编译器不支持这两个友元申明中的任何一个,那么,你不得不将必须的函数设为公有-但加一个注释解释为什么这么做,并提醒只要一升级你的编译器就将它改回私有。

根据文章中的测试结果,gcc3×仍然不支持其中任何一个。
要么别用namespace,要么用public,要么升级编译器。
todototry 2006-11-27
  • 打赏
  • 举报
回复
jf
argenCHN 2006-11-27
  • 打赏
  • 举报
回复
sf
jf up

64,649

社区成员

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

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