为何VC6下友员函数operator仍不能访问私有成员?编译报错!!

mmmcd 2005-03-22 12:15:24
#include<iostream>

using namespace std;

template <class T> class BaseType
{
friend ostream& operator<<(ostream & out, BaseType<int> & ele);
private:
T element;

public:
void setElement(T newElement);
T getElement();
};

template <class T>
void BaseType<T>::setElement(T newElement)
{
element = newElement;
}

template <class T>
T BaseType<T>::getElement()
{
return element;
}

template <class T>
ostream& operator <<(ostream& out, BaseType<T>& ele)
{
out<<"__"<<ele.element<<"__"<<endl;
return out;
}

int main()
{
BaseType<int> num,num2;

num.setElement(5);
num2.setElement(6);

cout<<num2;

return 0;
}
/////////////////////////////////////
//错误如下:
F:\MYPROJECTS\Assignment_2\Assignment_2.cpp(34) : error C2248: 'element' : cannot access private member declared in class 'BaseType<int>'
F:\MYPROJECTS\Assignment_2\Assignment_2.cpp(12) : see declaration of 'element'
F:\MYPROJECTS\Assignment_2\Assignment_2.cpp(45) : see reference to function template instantiation 'class std::basic_ostream<char,struct std::char_traits<char> > &__cdecl operator <<(class std::basic_ostream<char,struct std::char_traits<char
> > &,class BaseType<int> &)' being compiled
Error executing cl.exe.
...全文
234 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
languagec 2005-03-22
  • 打赏
  • 举报
回复
yuchengliu 2005-03-22
  • 打赏
  • 举报
回复
这个因改是VC6的问题
使用友元重载运算符的时候有问题
因改先声明一下
class BaseType;
ostream& operator<<(ostream & out, BaseType& ele);
xxxdg 2005-03-22
  • 打赏
  • 举报
回复
呵呵,不好意思,上面第四行末尾写成 BaseType<int>了
是BaseType<T>
xxxdg 2005-03-22
  • 打赏
  • 举报
回复
首先,
在friend 友元前加上 template <class T>

即:
tempate <class T> friend ostream& operator<<(ostream & out, BaseType<int> & ele);

如果是.Net,就可以通过了

如果是VC6,可怜的VC6对模板支持有限,还不能通过,
出现楼主所说的问题,
主要是因为编译后类中的友元<<声明和实际定义的<<模板不一致,
实际上类中的友元应该是被处理为void型的了
因此说返回值为ostream & 的<<不许访问私有成员。
以下示例程序通过VC6

////////////////////////////////////////////////////


template<class T>
class Base
{
template <class T>
friend void operator <<(ostream & out,Base<T> & a);
public:
Base(T x):data(x){}

private:
T data;
};

template <class T>
void operator << (ostream & out, Base<T> & a)
{
out<<a.data<<endl;
}

int main()
{
Base<int> a(100);
cout<<a;
system("Pause");

return 0;
}



WingForce 2005-03-22
  • 打赏
  • 举报
回复
偶编译通过,没有任何问题。。。
是不是你没有打sp6?
yjh1982 2005-03-22
  • 打赏
  • 举报
回复
如果是gcc,应该这样

#include<iostream>

using namespace std;

template <class T> class BaseType
{
template <class S>
friend ostream& operator<<(ostream & out, BaseType<S> & ele);
private:
T element;

public:
void setElement(T newElement);
T getElement();
};

template <class T>
void BaseType<T>::setElement(T newElement)
{
element = newElement;
}

template <class T>
T BaseType<T>::getElement()
{
return element;
}

template <class T>
ostream& operator <<(ostream& out, BaseType<T>& ele)
{
out<<"__"<<ele.element<<"__"<<endl;
return out;
}

int main()
{
BaseType<int> num,num2;

num.setElement(5);
num2.setElement(6);

cout<<num2;

return 0;
}
qwertasdfg123 2005-03-22
  • 打赏
  • 举报
回复
我测试了一下,怎么和楼主说的不一样啊!我在vc6下可以,用g++就不行了。
在g++下使用 yjh1982(血精灵)的方法。
mymyal123 2005-03-22
  • 打赏
  • 举报
回复
学习
yjh1982 2005-03-22
  • 打赏
  • 举报
回复

成#include<iostream>

using namespace std;

template <class T> class BaseType
{
friend ostream& operator<< (ostream & out, BaseType<int> & ele)
{
out<<"__"<<ele.element<<"__"<<endl;
return out;
}
private:
T element;

public:
void setElement(T newElement);
T getElement();
};

template <class T>
void BaseType<T>::setElement(T newElement)
{
element = newElement;
}

template <class T>
T BaseType<T>::getElement()
{
return element;
}



int main()
{
BaseType<int> num,num2;

num.setElement(5);
num2.setElement(6);

cout<<num2;

return 0;
}


vc6好象不支持模版友元
WingForce 2005-03-22
  • 打赏
  • 举报
回复
所以,强烈建议打补丁
kobefly 2005-03-22
  • 打赏
  • 举报
回复
zhangfjj(小张(张三的张,不小的小)) ( ) 信誉:105 2005-03-22 14:47:00 得分: 0


暴寒一个!

科比同学,不会吧?!


我也不知道啊,我的devc++也不能通过
但我的vc6
刚刚打了补丁
顺利通过啊

输出_6_

我也不大明白
zhangfjj 2005-03-22
  • 打赏
  • 举报
回复
暴寒一个!

科比同学,不会吧?!
xxxdg 2005-03-22
  • 打赏
  • 举报
回复
科比同学的代码,跟我在.Net下测试的一样,
也无法通过。
xxxdg 2005-03-22
  • 打赏
  • 举报
回复
俺拒绝打补丁,呵呵,
这样比较有挑战性
zhangfjj 2005-03-22
  • 打赏
  • 举报
回复
using namespace std;

template <class T> class BaseType
{
template <class S>
friend ostream& operator<<(ostream & out, BaseType<S> & ele);//友元函数的类型参数不能和类模板相同哟!!!!

若不修改的话,我在dev-c++4.9.8.5中也不能编译通过,莫说vc6了!

看了 kobefly(科比---开始学习c++!)的贴子,看来我的vc6也是要打下补丁了,^_^
kobefly 2005-03-22
  • 打赏
  • 举报
回复
在vc6打补丁之后顺利通过

#include<iostream>

using namespace std;

template <typename T>
class BaseType
{
friend ostream& operator <<(ostream& out, BaseType<T>& ele);

private:
T element;
public:
void setElement(T newElement);
T getElement();
};

template <class T>
void BaseType<T>::setElement(T newElement)
{
element = newElement;
}

template <class T>
T BaseType<T>::getElement()
{
return element;
}

template <class T>
ostream& operator <<(ostream& out, BaseType<T>& ele)
{
out<<"__"<<ele.element<<"__"<<endl;
return out;
}

int main()
{
BaseType<int> num,num2;

num.setElement(5);
num2.setElement(6);

cout<<num2;

return 0;
}
xxxdg 2005-03-22
  • 打赏
  • 举报
回复
呵呵,没有关系的,其实主要目的就是告诉编译器有这么一个怪模板作友元,
别的也没什么作用,用不用相同的符号其实都无所谓,
如果不是operator重载,不是template <class S>都可以不计吗,呵呵
你就把它当作模板类的相同类型参数的模板就好了,
没什么大不了的

你可以试试,可以的
zhangfjj 2005-03-22
  • 打赏
  • 举报
回复
如果是VC6,可怜的VC6对模板支持有限,还不能通过.
=============
可怜我,昨天折腾到晚2点
对模板不熟。
using namespace std;

template <class T> class BaseType
{
template <class S>
friend ostream& operator<<(ostream & out, BaseType<S> & ele);//友元函数的类型参数不能和类模板相同哟!!!!
private:
T element;

public:
void setElement(T newElement);
T getElement();
};

zhangfjj 2005-03-22
  • 打赏
  • 举报
回复
这是我写的非模板的
#include<iostream>

using namespace std;

class BaseType;
ostream& operator<<(ostream & out, BaseType& ele);
class BaseType
{
friend ostream& operator<<(ostream & out, BaseType& ele);
private:
int element;
public:
void setElement(int newElement);
int getElement();
};


void BaseType::setElement(int newElement)
{
element = newElement;
}

int BaseType::getElement()
{
return element;
}


ostream& operator <<(ostream& out, BaseType& ele)
{
out<<"__"<<ele.element<<"__"<<endl;
return out;
}

int main()
{
BaseType num,num2;

num.setElement(5);
num2.setElement(6);
//cout<<num2.getElement();
cout<<num2;

return 0;
}

却不知为何模板化后,老提示有问题???
zhangfjj 2005-03-22
  • 打赏
  • 举报
回复
template <class T> class BaseType
{
//friend ostream& operator<<(ostream & out, BaseType<int> & ele);似乎要改为BaseType<T> & ele
friend ostream& operator<<(ostream & out, BaseType<T> & ele);

private:
T element;

public:
void setElement(T newElement);
T getElement();
};


模板有点烦,明天再看

65,186

社区成员

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

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