设为首页收藏本站

新微赢技术网

 找回密码
 注册
搜索
热搜: 回贴
查看: 1345|回复: 8
打印 上一主题 下一主题

关于类模板中使用友元input/output操作符

[复制链接]
跳转到指定楼层
1#
发表于 2009-11-3 02:06:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
源程序:
template<int hi,int wid>
class Screen
{
public:
Screen():_cursor(0),_Screen(hi*wid,'#'){}
void home(){_cursor=0;}
void move(int,int);
char get(){return _Screen[_cursor];}
char get(int,int);
bool checkRange(int,int);
void copy(const Screen&);
void set(char c){_Screen=string(hi*wid,c);}
void set(const string&);
void set(const Screen&);
friend ostream& operator<<(ostream &out,const Screen<hi,wid> &s);
friend istream& operator>>(istream &in,Screen<hi,wid> &s);
private:
string _Screen;
int _cursor;
};
template<int hi,int wid>
ostream& operator<<(ostream &out,const Screen<hi,wid> &s)
{
for(int i=1;i<=hi;++i)
{
for(int j=1;j<=wid;++j)
out<<s.get(i,j); //C2663: 'get' : 2 overloads have no legal conversion for 'this' pointer
cout<<endl;
}
cout<<endl;
return out;
}

template<int hi,int wid>
istream& operator>>(istream &in,Screen<hi,wid> &s)
{
s.home();
for(int i=1;i<=hi;++i)
for(int j=1;j<=wid;++j)
in>>s._Screen[s._cursor++]; //友元为什么不能访问私有成员
return in;
}
template<int hi,int wid>
void Screen<hi,wid>::move(int row,int col)
{
if(checkRange(row,col))
{
int r=(row-1)*wid;
_cursor=col-1+r;
}
}

template<int hi,int wid>
bool Screen<hi,wid>::checkRange(int row,int col)
{
if(row<1||row>hi||col<1||col>wid)
{
cerr<<"System coordinate("
<<row<<","<<col
<<") out of bounds.\n";
return false;
}
return true;
}
template<int hi,int wid>
char Screen<hi,wid>::get(int r,int c)
{
move(r,c);
return get();
}
template<int hi,int wid>
void Screen<hi,wid>::copy(const Screen &sobj)
{
if(this!=&sobj)
{
_cursor=sobj._cursor;
_Screen=sobj._Screen;
}
}
template<int hi,int wid>
void Screen<hi,wid>::set(const Screen &s)
{
for(int r=1;r<=hi;++r)
for(int c=1;c<wid;++c)
{
move(r,c);
_Screen[_cursor]=s[_cursor];
}
}
template<int hi,int wid>
void Screen<hi,wid>::set(const string &s)
{
for(int r=1;r<=hi;++r)
for(int c=1;c<=wid;++c)
{
move(r,c);
_Screen[_cursor]=s[_cursor];
}
}

int main(void)
{
Screen<2,3> s1;
cout<<s1;
cout<<"please enter 6(chars):";
cin>>s1;
cout<<s1;

return 0;
}

功能描述:
我定义了一个类模板Screen<hi,wid>,想通过类模板中的friend input&output操作符输出Screen<2,3> s1中的内容
但是,友元的定义有问题:
问题1:error C2663: 'get' : 2 overloads have no legal conversion for 'this' pointer
d:\programe\c++ primer\test3\main.cpp(26) : 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> > &,
const class Screen<2,3> &)' being compiled
问题2: error C2248: '_Screen' : cannot access private member declared in class 'Screen<2,3>'
d:\programe\c++ primer\test3\screen.h(29) : see declaration of '_Screen'

谢谢:)
2#
发表于 2009-11-3 02:06:08 | 只看该作者
可能是我孤陋寡闻,第一次见人这样用模板类!
我说说可能的原因吧。
第2个问题,我想是这样的:
int _cursor;是你的类的私有成员;
然而,string类重载的[]运算符是不能调用你自己的类的私有成员的;
这里in>>s._Screen[s._cursor++];应该不是说你的友元函数不能access它,而是string类的[]重载函数不能调用它。或许你把string类设为友员类可以解决这个问题。不知道我说的对不对。
回复 支持 反对

使用道具 举报

3#
发表于 2009-11-3 02:06:09 | 只看该作者
请问,这是模板类吗?
回复 支持 反对

使用道具 举报

4#
发表于 2009-11-3 02:06:10 | 只看该作者
怎么没人说句话啊/
回复 支持 反对

使用道具 举报

5#
发表于 2009-11-3 02:06:11 | 只看该作者
aogun:
帮帮忙啊~!
myajax95:
怎么没来说句话啊?
需要朋友们的帮忙
回复 支持 反对

使用道具 举报

6#
发表于 2009-11-3 02:06:12 | 只看该作者
嘿嘿,我一看这么长的程序就不想看了
这是模板类啊,不过是类模板的部分特化的定义,即某些模板的参数被实际的类型或者值取代了
你说的出错的原因应该是说对点了
回复 支持 反对

使用道具 举报

7#
发表于 2009-11-3 02:06:13 | 只看该作者
但是为什么任意给一个私有数据成员都不能access呢?还有那个get
回复 支持 反对

使用道具 举报

8#
发表于 2009-11-3 02:06:15 | 只看该作者
我仔细看了一下
get不能用的原因是因为声明了const Screen<hi,wid> &s,如果声明了const,那么就不能访问不是const的成员,把const去掉就行了
cannot access private member declared in class 'Screen<2,3>的错误原因是因为友元函数的声明错误,lz的代码中的声明导致了多对一的情况,所以模板函数当然不能访问模板类中的私有成员,另外,>>全局操作符的重载原型返回类型应该是void,不应该是istream&,所以应该把模板类中对友元>>的声明改为如下声明:
template<int hi,int wid> friend void operator>>(istream &in,Screen<hi,wid> &s);
回复 支持 反对

使用道具 举报

9#
发表于 2009-11-3 02:06:16 | 只看该作者
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

申请友链|小黑屋|最新主题|手机版|新微赢技术网 ( 苏ICP备08020429号 )  

GMT+8, 2024-11-18 03:43 , Processed in 0.083884 second(s), 8 queries , Gzip On, Memcache On.

Powered by xuexi

© 2001-2013 HaiAn.Com.Cn Inc. 寰耽

快速回复 返回顶部 返回列表