模板自身友元的问题(模仿BOOST的shared_ptr时碰到)?

heyuen877 2006-11-05 09:04:48
以下是<boost\shared_ptr.hpp>中的部分代码:

template<class T> class shared_ptr
{
... ...(省略)

// Tasteless as this may seem, making all members public allows member templates
// to work in the absence of member template friends. (Matthew Langston)

#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
private:
template<class Y> friend class shared_ptr;
template<class Y> friend class weak_ptr;
#endif
}; // shared_ptr
(VC6.0成功编译通过)

而我写的时候template<class Y> friend class shared_ptr;却在那行报错。
出现
error C2059: syntax error : '<end Parse>'
see reference to class template instantiation 'shared_ptr<T>' being compiled
error C2143: syntax error : missing ';' before '}'
see reference to class template instantiation 'shared_ptr<T>' being compiled
error C2238: unexpected token(s) preceding ';'
see reference to class template instantiation 'shared_ptr<T>' being compiled
... ...
去掉template<class Y> friend class shared_ptr;正常。但是我要派生类的智能指针模板内部可以访问其父类的私有成员。就是shared_ptr<inherit_class>内部访问shared_ptr<parent_class>的私有成员(不用get,就用friend class)。

但是<boost\shared_ptr.hpp>可以,我写的却编译不过.那位大侠99.



...全文
297 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
taodm 2006-11-06
  • 打赏
  • 举报
回复
那段英文你看了没有?
heyuen877 2006-11-06
  • 打赏
  • 举报
回复
我狂汗。。。果然是VC6对模板的支持不好。。。怪的是BOOST的那个文件我怎么可以编译的过。
我在2005下成功编译实现了:“shared_ptr<inherited_class>可以访问shared_ptr<parent_ptr>的私有成员变量”,但在VC6老是报错,无法编译。唉。
谢谢zenny_chen。给分了。
heyuen877 2006-11-06
  • 打赏
  • 举报
回复
谢谢zenny_chen。
刚看到zenny_chen的回答。我试一下。可以的话马上加分。呵呵
heyuen877 2006-11-06
  • 打赏
  • 举报
回复
大家可能没理解我地提问,重新描述下我的问题:
正如上面马太.兰斯顿说的那样与其“让所有的模板成员变成公共的,允许成员模板工作在没有成员模板友元的情况下”,倒不如用友元来实现访问类模板私有的成员变量。
我所要的就是有这样的template<class T> class shared_ptr:
shared_ptr<inherited_class>可以访问shared_ptr<parent_ptr>的私有成员变量.

(注:实际上shared_ptr<parent_class>可以自动转换类型轻松地访问shared_ptr<inherited_ptr>的私有成员变量)
zenny_chen 2006-11-06
  • 打赏
  • 举报
回复
另外,VC6对C++标准支持得很糟。
zenny_chen 2006-11-06
  • 打赏
  • 举报
回复
模板对自身友元的情况也一样

template <typename T>
class Pat
{
friend class Test;

friend class Pat; // 对自身友元

private:

T i;

public:

Pat(T t) : i(t)
{

}
};
zenny_chen 2006-11-06
  • 打赏
  • 举报
回复
#include <iostream>

using namespace std;


template <typename T> class Test; // 对于模板类的友元声明必须先放在外面声明一下


template <typename T>
class Pat
{
friend class Test; // 这里不能加template <typename T>,但是前面已将Test类声明为友元

private:

T i;

public:

Pat(T t) : i(t)
{

}
};


template <typename T>
class Test
{
private:

T i;

public:

Test(Pat<T> &ref)
{
i = ref.i;
}

inline void GetData(void)const
{
cout << "The data is: " << i << endl;
}
};



void main(void)
{
Pat<int> pat(3);

Test<int> t(pat);

t.GetData(); // 执行正确
}

// 在VS2003.NET下通过编译、连接、运行
heyuen877 2006-11-06
  • 打赏
  • 举报
回复
你是指:
// Tasteless as this may seem, making all members public allows member templates
// to work in the absence of member template friends. (Matthew Langston)
这段吗?
我英文不好,翻译如下:
让所有的模板成员变成公共的,允许成员模板工作在没有成员模板友元的情况下,这看起来可能有点煞风景。(马太.兰斯顿)
不知对否?
我没理解错的话,这是说这里用FRIENDS的原因。和我的问题有何关系?
我用了FRIENDS但是报错。我想该不是VC6编译器的问题。因为BOOST的代码我编译成功了。

64,646

社区成员

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

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