为什么vs2015说==运算符不能用,就是sour==cin,这在vc6.0就可以用

includeios 2017-01-10 03:48:40
#include"stdafx.h"
#include<iostream>
#include<fstream>
#include<iomanip>
#include<string>
using namespace std;

template <typename T>
class Array
{
T *elements;
int last; //已用最大下标值
int maxSize; //数组容量
public:
Array(int = 2); //为了便于检验,缺省元素数暂为2
~Array();
bool IsFull(); //判容器是否满
void renews(int); //数组容量增加若干个元素
void insertFront(T&); //将数据插入在数组最前面
friend ostream& operator<<(ostream& dest, Array& ar)
{
if (ar.last == -1) cout << "暂无信息" << endl;
else for (int i = 0; i <= ar.last; i++) dest << ar.elements[i] << endl;
return dest;
}
};

template <typename T>Array<T>::Array(int maxs) {
//补充代码,创建并初始化数组,如有历史数据,则从文件"Exam6.txt"中读取
maxSize = maxs;
elements = new T[maxSize];
last = -1;
T temp;
ifstream datafile("Exam6.txt");
if (!datafile == 0) {//文件存在,则从文件读取数据
while (!datafile.eof()) {//!datafile.eof()是没有到文件结尾的意思
datafile >> temp;
insertFront(temp);
}
datafile.close();
datafile.clear(0);
}//因为是模板,所以志愿者类的东西都不能出现,实现通用性!!!!!!
}//写模板函数的时候要把它当成最普通的数据类型来写

template <typename T>Array<T>::~Array() {
//补充代码,释放动态数组空间,数据写入文件Exam6.txt
if (last != -1) {
ofstream datafile("Exam6.txt");
if (!datafile) cout << "fail to open." << endl;
else {
for (int i = 0; i <= last; i++) datafile << elements[i] << endl;
datafile.close();
}
}
delete[]elements;
}
template <typename T>bool Array<T>::IsFull()
{
return (last == maxSize - 1);
}

template <typename T>
void Array<T>::renews(int augment)
{
//完成数组容器增加augment个元素空间
T* temp = elements;
elements = new T[maxSize + augment];
maxSize += augment;
for (int i = 0; i <= last; i++) elements[i] = temp[i];//需重载志愿者类的等于运算符
delete[]temp;
}

template <typename T>void Array<T>::insertFront(T & elem)
{
//补充代码,将数据插入到数组第一个位置
if (IsFull()) renews(1);
if (last == -1) elements[last + 1] = elem;
else for (int i = last; i > 0; i--) elements[i] = elements[i - 1];
elements[0] = elem;
last++;
}

class volunteer {
string Name;//志愿者姓名
string No;//身份证号
string Department;//所在院系
string Date;//参加日期
public:
volunteer(string = "", string = "", string = "", string = "");
friend ostream& operator<<(ostream&, volunteer&); //重载插入运算符
friend istream& operator >> (istream&, volunteer&);
// bool operator==(volunteer &);//志愿者姓名为关键字
bool operator<(volunteer &); //志愿者姓名为关键字
bool operator==(volunteer &);
};
istream&operator >> (istream& sour, volunteer& vlt)
{//文件流类作为形式参数必须是引用
if (sour == cin)
{// 完成键盘输入部分,键盘输入必须有提示
cout << "请输入志愿者姓名、身份证号、所在院系、参加日期(yymmdd,如150920): " << endl;
sour >> vlt.Name >> vlt.No >> vlt.Department >> vlt.Date;
}
else
{ //文件输入不要提示,完成由文件输入部分
sour >> vlt.Name >> vlt.No >> vlt.Department >> vlt.Date;
}
return sour;
}
ostream& operator<<(ostream& dest, volunteer& vlt) //重载插入运算符
{
dest << " " << vlt.Name << " " << vlt.No << " " << vlt.Department << " " << vlt.Date;
return dest;
}
bool volunteer::operator==(volunteer &me) {
return Name == me.Name;
}
volunteer::volunteer(string name, string no, string department, string date) {
//完成构造函数&
Name = name;
No = no;
Department = department;
Date = date;
}

bool volunteer::operator<(volunteer& vlt)
{//为按身份证号排序重载关系运算符
//重载==运算符
if (Name < vlt.Name)
return 1;
else return 0;
}

int main()
{
Array<volunteer> mylist;
cout << mylist;
volunteer temp;
char ch;
cout << "是否输入新志愿者?Y or N" << endl;
cin >> ch;
while (ch == 'Y' || ch == 'y')
{
cin.get();//吸收回车
cin >> temp;
mylist.insertFront(temp);
cout << "是否继续输入? Y or N" << endl;
cin >> ch;
}
cout << mylist;
return 0;
}
...全文
437 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
includeios 2017-01-12
  • 打赏
  • 举报
回复
引用 11楼赵4老师 的回复:
理解讨论之前请先学会如何观察! 计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程! 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步Debug版对应汇编一行! 单步Debug版对应汇编千行不如单步Release版对应汇编一行! 不会单步Release版对应汇编?在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有,然后在IDE中运行。(一般人我不告诉他!单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。 VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
谢老师
赵4老师 2017-01-11
  • 打赏
  • 举报
回复
理解讨论之前请先学会如何观察! 计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程! 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步Debug版对应汇编一行! 单步Debug版对应汇编千行不如单步Release版对应汇编一行! 不会单步Release版对应汇编?在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有,然后在IDE中运行。(一般人我不告诉他!单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。 VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
赵4老师 2017-01-11
  • 打赏
  • 举报
回复
赵4老师 2017-01-11
  • 打赏
  • 举报
回复
我在VC2010里面单步调试
if (sour == cin) {
这句对应汇编:
幻夢之葉 2017-01-11
  • 打赏
  • 举报
回复
换成 &sour == &cin io流不支持拷贝,所以sour和cin相同必定是同一个对象,所以比较它们的指针就达到你要的效果了
小灸舞 2017-01-11
  • 打赏
  • 举报
回复
vc6不报错,不代表你那样用就是好的
幻夢之葉 2017-01-11
  • 打赏
  • 举报
回复
引用 13 楼 xsklld 的回复:
[quote=引用 8 楼 jianwen0529 的回复:] 换成 &sour == &cin io流不支持拷贝,所以sour和cin相同必定是同一个对象,所以比较它们的指针就达到你要的效果了
但不同的流对象可能指向相同的流缓冲。此处用sour.rdbuf() == cin.rdbuf()比较好。[/quote] 受教了!
xskxzr 2017-01-11
  • 打赏
  • 举报
回复
引用 8 楼 jianwen0529 的回复:
换成 &sour == &cin io流不支持拷贝,所以sour和cin相同必定是同一个对象,所以比较它们的指针就达到你要的效果了
但不同的流对象可能指向相同的流缓冲。此处用sour.rdbuf() == cin.rdbuf()比较好。
paschen 版主 2017-01-11
  • 打赏
  • 举报
回复
要判断他是不是cin建议判断地址是否一样
xskxzr 2017-01-10
  • 打赏
  • 举报
回复
istream本来就不能用==来比较啊,天知道vc6是怎么想的。
includeios 2017-01-10
  • 打赏
  • 举报
回复
引用 4楼我是你的主体 的回复:
这是为什么
includeios 2017-01-10
  • 打赏
  • 举报
回复
includeios 2017-01-10
  • 打赏
  • 举报
回复
引用 2楼赵4老师 的回复:
VS2010编译通过:
//#include"stdafx.h"
#include<iostream>
#include<fstream>
#include<iomanip>
#include<string>
using namespace std;

template <typename T>
class Array {
    T *elements;
    int last;           //已用最大下标值
    int maxSize;        //数组容量
public:
    Array(int = 2);      //为了便于检验,缺省元素数暂为2
    ~Array();
    bool IsFull();        //判容器是否满
    void renews(int);      //数组容量增加若干个元素
    void insertFront(T&);   //将数据插入在数组最前面
    friend ostream& operator<<(ostream& dest, Array& ar) {
        if (ar.last == -1) cout << "暂无信息" << endl;
        else for (int i = 0; i <= ar.last; i++) dest << ar.elements[i] << endl;
        return dest;
    }
};

template <typename T>Array<T>::Array(int maxs) {
    //补充代码,创建并初始化数组,如有历史数据,则从文件"Exam6.txt"中读取
    maxSize = maxs;
    elements = new T[maxSize];
    last = -1;
    T temp;
    ifstream datafile("Exam6.txt");
    if (!datafile == 0) {//文件存在,则从文件读取数据
        while (!datafile.eof()) {//!datafile.eof()是没有到文件结尾的意思
            datafile >> temp;
            insertFront(temp);
        }
        datafile.close();
        datafile.clear(0);
    }//因为是模板,所以志愿者类的东西都不能出现,实现通用性!!!!!!
}//写模板函数的时候要把它当成最普通的数据类型来写

template <typename T>Array<T>::~Array() {
    //补充代码,释放动态数组空间,数据写入文件Exam6.txt
    if (last != -1) {
        ofstream datafile("Exam6.txt");
        if (!datafile) cout << "fail to open." << endl;
        else {
            for (int i = 0; i <= last; i++) datafile << elements[i] << endl;
            datafile.close();
        }
    }
    delete[]elements;
}
template <typename T>bool Array<T>::IsFull() {
    return (last == maxSize - 1);
}

template <typename T>
void Array<T>::renews(int augment) {
    //完成数组容器增加augment个元素空间
    T* temp = elements;
    elements = new T[maxSize + augment];
    maxSize += augment;
    for (int i = 0; i <= last; i++) elements[i] = temp[i];//需重载志愿者类的等于运算符
    delete[]temp;
}

template <typename T>void Array<T>::insertFront(T & elem) {
    //补充代码,将数据插入到数组第一个位置
    if (IsFull()) renews(1);
    if (last == -1) elements[last + 1] = elem;
    else for (int i = last; i > 0; i--) elements[i] = elements[i - 1];
    elements[0] = elem;
    last++;
}

class volunteer {
    string Name;//志愿者姓名
    string No;//身份证号
    string Department;//所在院系
    string Date;//参加日期
public:
    volunteer(string = "", string = "", string = "", string = "");
    friend ostream& operator<<(ostream&, volunteer&);  //重载插入运算符
    friend istream& operator >> (istream&, volunteer&);
	//	bool operator==(volunteer &);//志愿者姓名为关键字
    bool operator<(volunteer &); //志愿者姓名为关键字
    bool operator==(volunteer &);
};
istream&operator >> (istream& sour, volunteer& vlt) {//文件流类作为形式参数必须是引用
    if (sour == cin) {// 完成键盘输入部分,键盘输入必须有提示
        cout << "请输入志愿者姓名、身份证号、所在院系、参加日期(yymmdd,如150920): " << endl;
        sour >> vlt.Name >> vlt.No >> vlt.Department >> vlt.Date;
    } else { //文件输入不要提示,完成由文件输入部分
        sour >> vlt.Name >> vlt.No >> vlt.Department >> vlt.Date;
    }
    return sour;
}
ostream& operator<<(ostream& dest, volunteer& vlt)  //重载插入运算符
{
    dest << "  " << vlt.Name << "  " << vlt.No << "  " << vlt.Department << "  " << vlt.Date;
    return dest;
}
bool volunteer::operator==(volunteer &me) {
    return Name == me.Name;
}
volunteer::volunteer(string name, string no, string department, string date) {
    //完成构造函数&
    Name = name;
    No = no;
    Department = department;
    Date = date;
}

bool volunteer::operator<(volunteer& vlt) {//为按身份证号排序重载关系运算符
    //重载==运算符
    if (Name < vlt.Name)
        return 1;
    else return 0;
}

int main() {
    Array<volunteer> mylist;
    cout << mylist;
    volunteer temp;
    char ch;
    cout << "是否输入新志愿者?Y or N" << endl;
    cin >> ch;
    while (ch == 'Y' || ch == 'y') {
        cin.get();//吸收回车
        cin >> temp;
        mylist.insertFront(temp);
        cout << "是否继续输入? Y or N" << endl;
        cin >> ch;
    }
    cout << mylist;
    return 0;
}

谢谢,请问我用的vs2015有问题吗
赵4老师 2017-01-10
  • 打赏
  • 举报
回复
VS2010编译通过:
//#include"stdafx.h"
#include<iostream>
#include<fstream>
#include<iomanip>
#include<string>
using namespace std;

template <typename T>
class Array {
    T *elements;
    int last;           //已用最大下标值
    int maxSize;        //数组容量
public:
    Array(int = 2);      //为了便于检验,缺省元素数暂为2
    ~Array();
    bool IsFull();        //判容器是否满
    void renews(int);      //数组容量增加若干个元素
    void insertFront(T&);   //将数据插入在数组最前面
    friend ostream& operator<<(ostream& dest, Array& ar) {
        if (ar.last == -1) cout << "暂无信息" << endl;
        else for (int i = 0; i <= ar.last; i++) dest << ar.elements[i] << endl;
        return dest;
    }
};

template <typename T>Array<T>::Array(int maxs) {
    //补充代码,创建并初始化数组,如有历史数据,则从文件"Exam6.txt"中读取
    maxSize = maxs;
    elements = new T[maxSize];
    last = -1;
    T temp;
    ifstream datafile("Exam6.txt");
    if (!datafile == 0) {//文件存在,则从文件读取数据
        while (!datafile.eof()) {//!datafile.eof()是没有到文件结尾的意思
            datafile >> temp;
            insertFront(temp);
        }
        datafile.close();
        datafile.clear(0);
    }//因为是模板,所以志愿者类的东西都不能出现,实现通用性!!!!!!
}//写模板函数的时候要把它当成最普通的数据类型来写

template <typename T>Array<T>::~Array() {
    //补充代码,释放动态数组空间,数据写入文件Exam6.txt
    if (last != -1) {
        ofstream datafile("Exam6.txt");
        if (!datafile) cout << "fail to open." << endl;
        else {
            for (int i = 0; i <= last; i++) datafile << elements[i] << endl;
            datafile.close();
        }
    }
    delete[]elements;
}
template <typename T>bool Array<T>::IsFull() {
    return (last == maxSize - 1);
}

template <typename T>
void Array<T>::renews(int augment) {
    //完成数组容器增加augment个元素空间
    T* temp = elements;
    elements = new T[maxSize + augment];
    maxSize += augment;
    for (int i = 0; i <= last; i++) elements[i] = temp[i];//需重载志愿者类的等于运算符
    delete[]temp;
}

template <typename T>void Array<T>::insertFront(T & elem) {
    //补充代码,将数据插入到数组第一个位置
    if (IsFull()) renews(1);
    if (last == -1) elements[last + 1] = elem;
    else for (int i = last; i > 0; i--) elements[i] = elements[i - 1];
    elements[0] = elem;
    last++;
}

class volunteer {
    string Name;//志愿者姓名
    string No;//身份证号
    string Department;//所在院系
    string Date;//参加日期
public:
    volunteer(string = "", string = "", string = "", string = "");
    friend ostream& operator<<(ostream&, volunteer&);  //重载插入运算符
    friend istream& operator >> (istream&, volunteer&);
	//	bool operator==(volunteer &);//志愿者姓名为关键字
    bool operator<(volunteer &); //志愿者姓名为关键字
    bool operator==(volunteer &);
};
istream&operator >> (istream& sour, volunteer& vlt) {//文件流类作为形式参数必须是引用
    if (sour == cin) {// 完成键盘输入部分,键盘输入必须有提示
        cout << "请输入志愿者姓名、身份证号、所在院系、参加日期(yymmdd,如150920): " << endl;
        sour >> vlt.Name >> vlt.No >> vlt.Department >> vlt.Date;
    } else { //文件输入不要提示,完成由文件输入部分
        sour >> vlt.Name >> vlt.No >> vlt.Department >> vlt.Date;
    }
    return sour;
}
ostream& operator<<(ostream& dest, volunteer& vlt)  //重载插入运算符
{
    dest << "  " << vlt.Name << "  " << vlt.No << "  " << vlt.Department << "  " << vlt.Date;
    return dest;
}
bool volunteer::operator==(volunteer &me) {
    return Name == me.Name;
}
volunteer::volunteer(string name, string no, string department, string date) {
    //完成构造函数&
    Name = name;
    No = no;
    Department = department;
    Date = date;
}

bool volunteer::operator<(volunteer& vlt) {//为按身份证号排序重载关系运算符
    //重载==运算符
    if (Name < vlt.Name)
        return 1;
    else return 0;
}

int main() {
    Array<volunteer> mylist;
    cout << mylist;
    volunteer temp;
    char ch;
    cout << "是否输入新志愿者?Y or N" << endl;
    cin >> ch;
    while (ch == 'Y' || ch == 'y') {
        cin.get();//吸收回车
        cin >> temp;
        mylist.insertFront(temp);
        cout << "是否继续输入? Y or N" << endl;
        cin >> ch;
    }
    cout << mylist;
    return 0;
}

includeios 2017-01-10
  • 打赏
  • 举报
回复
明天考试,求大佬帮忙

65,187

社区成员

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

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