LadyGaga
LadyGaga

Reputation: 29

a c++ code can't be compiled, because ifstream is inaccessable

    //**************************************************************************************************************
// FILE: a04.cpp
//**************************************************************************************************************
#include <fstream>
#include <iostream>
#include "Sorter.hpp"
using namespace std;
// Write the function header for Merge ()
void Merge(int a[] , int b[],int c[], int n)
{
    int i = 0, j = 0, k = 0;
    while (i < n || j < n) {
        // Write the if-elseif-elseif-... statement in the body of the while loop
        if (i < n  && j < n && a<=b) {
                c = a;
                i++;
        }
        else if (i < n && j < n && a > b) {
            c =b;
            j++;
        }
        else if (i < n) {
            c = a;
            i++;
        }
        else {
            c =b;
            j++;
        }
        k++;
    } // end while
} // end function merge

void ReadList(ifstream fin, int a[], int n);

void ReadFile(int a[], int b[], int& n)
{
    ifstream fin ("ints-in.txt");
    ReadList(fin,a,n); // come back again different than the psuedo code
    ReadList(fin,b,n);
    fin.close();
} 


// Write the function header for ReadList()
void ReadList(ifstream fin, int a[], int n)
{
    n = 0;
    int number;
    // Implement the sentinel loop
    while (fin >> number && number != -1) {
        a[n] = number;
        n++; // come back again
    }
}


void WriteFile(int a[], int n)
{
    ofstream fout("ints-out.txt");
    // Write a vary loop where variable ivaries from 0 to n - 1. In the loop send a[i] and ' ' to fout.
    for (int i =0; i <= n-1; i++) {
        fout << a << ' '; // come back again.
    }
    fout << -1;
    fout.close();
}


int main()
{
// Define int arrays a,b, and c and int variable n.
int a[100], b[100], c[200];
int n;

// Call ReadFile () passing a,b, and n
ReadFile(a,b,n);

// Define and create a Sorter object named sorter
Sorter sorter;
// Call SelectionSort() on sorter to sort a into ascending order.
// Hint: to access the ASCENDING constant data member of the Sorter class you write Sorter::ASCENDING.
sorter.SelectionSort(a,100,Sorter::ASCENDING); //come back again here.

// Call BubbleSort () on sorter to sort b into ascending order
sorter.BubbleSort(b,100,Sorter::ASCENDING);
// Call Merge() passing a,b,c, and n
Merge(a,b,c,n);
// Call WriteFile () passing c and 2n
WriteFile(c,2*n);

return 0;
} 

I don't know why it can't be compiled.

Error 1 error C2248: 'std::basic_ifstream<_Elem,_Traits>::basic_ifstream' : cannot access private member declared in class 'std::basic_ifstream<_Elem,_Traits>' c:\users\hisham\documents\visual studio 2012\projects\homework4\a04.cpp 39 1 Homework4 Error 2 error C2248: 'std::basic_ifstream<_Elem,_Traits>::basic_ifstream' : cannot access private member declared in class 'std::basic_ifstream<_Elem,_Traits>' c:\users\hisham\documents\visual studio 2012\projects\homework4\a04.cpp 40 1 Homework4 3 IntelliSense: "std::basic_ifstream<_Elem, _Traits>::basic_ifstream(const std::basic_ifstream<_Elem, _Traits>::_Myt &_Right) [with _Elem=char, _Traits=std::char_traits]" (declared at line 827 of "C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\fstream") is inaccessible c:\Users\Hisham\Documents\Visual Studio 2012\Projects\Homework4\a04.cpp 39 11 Homework4 4 IntelliSense: "std::basic_ifstream<_Elem, _Traits>::basic_ifstream(const std::basic_ifstream<_Elem, _Traits>::_Myt &_Right) [with _Elem=char, _Traits=std::char_traits]" (declared at line 827 of "C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\fstream") is inaccessible c:\Users\Hisham\Documents\Visual Studio 2012\Projects\Homework4\a04.cpp 40 11 Homework4

Thanks.

Upvotes: 0

Views: 749

Answers (4)

user3079219
user3079219

Reputation: 1

I've been working on this same code and I have something different in the Merge() function.

void Merge(int a[], int b[], int c[], int& n)
 {
   int i = 0, j = 0, k = 0;
   while (i < n || j < n) 
 {
    if (i < n && j < n && a[i] <= b[j])
     {c[k] = a[i];
    i++;}
    else if (i < n  && j < n && a[i] > b[j])
     {c[k] = b[j];
     j++;}
    else if (i < n)
    {c[k] = a[i];
    i++;}
     else
     {c[k] = b[j];
    j++;}
    k++;
      }
  }

I put the i, j, and k in the brackets. I'm not sure if this is correct or not, but I haven't had any error messages on that part.

Upvotes: 0

Zac Howland
Zac Howland

Reputation: 15872

void ReadFile(int a[], int b[], int& n)
{
    ifstream fin ("ints-in.txt");
    ReadList(fin,a,n); // come back again different than the psuedo code
    ReadList(fin,b,n);
    fin.close();
} 

void ReadList(ifstream fin, int a[], int n)

You are attempting to pass a istream instance by copy. You cannot do that - the copy constructors are marked private.

You need to declare your ReadList function as:

void ReadList(ifstream& fin, int a[], int n)

Upvotes: 1

Cheers and hth. - Alf
Cheers and hth. - Alf

Reputation: 145269

iostreams are not copyable, so can't pass them by value.

Upvotes: 1

Benjamin Lindley
Benjamin Lindley

Reputation: 103693

The error doesn't say ifstream is inaccessible. It says (in its own convoluted way) that the copy constructor is inaccessible, because it is declared private. The problem is that you're passing ifstream by value, which tries to invoke the inaccessible copy constructor.

void ReadList(ifstream fin, int a[], int n)

Pass it by reference instead.

void ReadList(ifstream & fin, int a[], int n)

Upvotes: 5

Related Questions