C++:无法从'std::ifstream'转换为'char*'

C++: cannot convert from 'std::ifstream' to 'char*'

本文关键字:转换 char ifstream std C++      更新时间:2023-10-16

我正在做关于模板和从文件中读取的家庭作业。我有一个名为"Cfile"的模板类和一个"Student"类。我将把相关代码放在这里,然后询问错误:

#include<iostream>
#include<fstream>
using namespace std;
template <class T>
class Cfile
{
    ifstream fileIn;
...jump down a bit
T read()
{
    return T(this->fileIn); //the error is in this line
}

我得到了错误:返回行上的cannot convert from 'std::ifstream' to 'char*'

学生类当然有一个C'tor获得一个ifstream& in并创建一个新的学生:

Student::Student(ifstream & in)
{
in.read((char*)&age, sizeof(age));
}
编辑:我想我现在明白是怎么回事了。我有另一个叫做'MyString'的类,它有下面的read方法:
char* read(ifstream& in);

所以也许我不小心重写了read方法?但是返回类型是不同的,所以它不应该发生。

编辑# 2:Main.cpp -

#include"Cfile.h"
#include"Student.h"
#include"Queue.h"
#include "C.h"
int main()
{
    ifstream i;
    i.open("strings.txt");
    Cfile<Student>stuFile("strings.txt");
    Student a, b, c;
    a.age = 10;
    b.age = 20;
    c.age = 30;
    stuFile.write(a);
    stuFile.write(b);
    stuFile.write(c);

    Student d = Student(i);
    Student e = Student(i);
    Student f = Student(i);

    Cfile<char*> st;
    Queue<char*> st1;
    for (int i = 0;i < 10;i++)
    {
        st.read(st1.arr, 10);
    }
    i.close();
    return 0;
}

MyString.cpp -

#include "MyString.h"

MyString::MyString()
{
}
MyString::MyString(char * st)
{
    this->st = st;
}
char * MyString::read(ifstream& in)
{
    in.read(this->st, sizeof(st));
    return st;
}
const char * MyString::getStr()
{
    return this->st;
}

MyString::~MyString()
{
}

Student.cpp -

#include "Student.h"

/*bool Student::operator==(Student student)
{
    return this->name == student.name &&
        this->lastName == student.lastName &&
        this->age == student.age;
}*/
Student::Student()
{
}
Student Student::read(ifstream& in)
{
    in.read((char*)&age, sizeof(age));
    return *this;
}
void Student::write(ofstream & out)
{
    out.write((char*)&age, sizeof(age));
}
Student::Student(ifstream & in)
{
    in.read((char*)&age, sizeof(age));
}
Student::Student(Student &s)
{
    this->age = s.age;
}
Student::Student(int age)
{
    //Student s = new Student;
    this->age = age;
}

Student::~Student()
{
}

Cfile.h -

#pragma once
#include<iostream>
#include<fstream>
using namespace std;
template <class T>
class Cfile
{
    ifstream fileIn;
    ofstream fileOut;
public:
    Cfile() {};
    Cfile(char* _fileName) {
        fileIn.open(_fileName, ios::binary);
        fileOut.open(_fileName, ios::binary);
    }
    int read(T **apBuf, int aNum) 
        {
            int count=0;
            apBuf = new T*[aNum];
            for (int i = 0;i < aNum;i++)
            {
                *apBuf[i] = this->read();
                count++;
            }
            return count;

    }
    void write(T &t)
    {
        t.write(this->fileOut);
    }
    void write(T* apBuf, int aNum) {
        for (int i = 0;i < aNum;i++)
        {
            write(apBuf[i]);
        }
    }
    int size()
    {
        fileIn.seekg(0, ios::end);
        return (fileIn.tellg() / sizeof(T));
    }
    T read()
    {
        return T(this->fileIn);
    }
    ~Cfile() {};
};

考虑到问题的质量,我会尽量回答得好。

   Cfile<char*> st;
   Queue<char*> st1;
   for (int i = 0;i < 10;i++)
   {
       st.read(st1.arr, 10); // Error happens here
   }
   i.close();

在这里又失败了

int read(T **apBuf, int aNum) 
{
     int count=0;
     apBuf = new T*[aNum];
     for (int i = 0;i < aNum;i++)
     {
         *apBuf[i] = this->read(); // Error
         count++;
     }
     return count;

}

您正在尝试从ifstream构建char *,这失败了,因为它们是非常不同的类型。我建议你重新考虑一下标线。我也怀疑你不完全确定ifstream实际上是什么,所以我建议你重新阅读文档。
在侧节点上,对apBuf = new T*[aNum];上的new的调用不会事先调用delete,这意味着您有内存泄漏