C++模板问题:重载operator<< 15

#include<iostream>usingstd::cerr;usingstd::cout;usingstd::cin;usingstd::endl;usingstd... #include <iostream>
using std::cerr;
using std::cout;
using std::cin;
using std::endl;
using std::ostream;
using std::istream;
#include <iomanip>
using namespace std;

#ifndef ARRAY_H
#define ARRAY_H
template <typename T>
class Array
{
friend ostream &operator<<( ostream &, Array<T> &);

public:
Array( int = 10 );
T getSize() const;
~Array() { delete [] ptr;}
const Array &operator=(const Array &);
private:
int size;
int *ptr;
};

template <typename T>
ostream & operator<<(ostream &out, Array<T> &a)
{
int i;
for (i=0; i<a.size; i++)
{
out<<setw(12)<<a.ptr[i];
if ( (i+1) % 4 ==0 )
out<<endl;
}
if (i%4 !=0 )
out<<endl;
return out;
}

#include <iostream>
using namespace std;

#include "Array.h"

int main()
{
Array < int > integer(7);
Array < int > integer2(8);
integer=integer2;
cout<<integer;
return 0;
}

省略了一些其他函数。
报出的错误:
error C2248: 'size' : cannot access private member declared in class 'Array<int>'
error C2248: 'ptr' : cannot access private member declared in class 'Array<int>'

我们学院的编译器是VC++6.0
如何解决。
注意,我已经声明为友元了。
致二楼:对不起,结果还是一样。

致二楼:可能我的编译器太旧了,我用的是VC++6.0
请问您用的哪个编译器?
我这里爆出的结果和以前的一样。
展开
 我来答
百度网友a746892bb
2007-12-26 · TA获得超过107个赞
知道小有建树答主
回答量:178
采纳率:0%
帮助的人:0
展开全部
你访问了私有成员...比如ptr.是私有的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
风骚的可乐
2008-01-01 · TA获得超过1550个赞
知道小有建树答主
回答量:412
采纳率:0%
帮助的人:611万
展开全部
一样是VC6。

编译器版本:

C:\>cl
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

usage: cl [ option... ] filename... [ /link linkoption... ]

---------------------------------

to 楼主:
不给出完整代码无法给你答案。因为我这边就你现在给的代码片断来看没有任何错误,可以顺利编译(参见下面代码)。

--------------

to楼上:
friend就是用来访问私有成员的。

------------

楼主写法没有问题。

需要注意的是VC6中如果自己写模版类,部分函数的实现需要写在头文件中,特别是友元。

-------------------

测试输出:
0 0 0 0
0 0 0
Press any key to continue

由于给的代码不全,自己随便写了构造函数和等号操作符,调试代码如下(单文件,VC6控制台工程)
-------------------------------
#include <iostream>
using std::cerr;
using std::cout;
using std::cin;
using std::endl;
using std::ostream;
using std::istream;
#include <iomanip>
using namespace std;

template <typename T>
class Array
{
friend ostream &operator<<( ostream &, Array<T> &);

public:
Array( int len = 10 ) {ptr=new int[len]; for(int i=0;i<len;i++) ptr[i]=0; size=len;};
T getSize() const;
~Array() { delete [] ptr;}
const Array &operator=(const Array &a) {return a;};
private:
int size;
int *ptr;
};

template <typename T>
ostream & operator<<(ostream &out, Array<T> &a)
{
int i;
for (i=0; i<a.size; i++)
{
out<<setw(12)<<a.ptr[i];
if ( (i+1) % 4 ==0 )
out<<endl;
}
if (i%4 !=0 )
out<<endl;
return out;
}

int main()
{
Array < int > integer(7);
Array < int > integer2(8);
integer=integer2;
cout<<integer;
return 0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式