problems with standard header

R

Ryan D. Lucey

ok I'm trying out a small program using operator overloading from the book
C++ How To Program by Deitel Deitel. In their code they use the old style
headers
and the program compiles and runs as it should, but if I switch to the new
style headers and add 'using namespace std' and change nothing else
I get errors saying that the class object cannot access private data in the
class although the overloaded function is declared as a friend. It compiles
fine however if I add the .h extension to the headers <iostream> and
<iomanip>

What gives ?


Ryan
 
R

Ryan D. Lucey

I kind of solved the problem, if I specify the namespace
std for all of the objects i'm using that belong to namespace std it
compiles without problem (i.e. std::cout << myObject as opposed to cout <<
myObject in which I get an ambiguous call error ). Why isn't this resolved
when I do using namespace std; Do I have
to use std:: before anything I want to use within that namespace ?
 
J

John Harrison

Ryan D. Lucey said:
ok I'm trying out a small program using operator overloading from the book
C++ How To Program by Deitel Deitel. In their code they use the old style
headers
and the program compiles and runs as it should, but if I switch to the new
style headers and add 'using namespace std' and change nothing else
I get errors saying that the class object cannot access private data in the
class although the overloaded function is declared as a friend. It compiles
fine however if I add the .h extension to the headers <iostream> and
<iomanip>

What gives ?

Hard to say without seeing the code. My guess would be that you've declared
the friendship wrongly, remember operator<< is now in the std namespace. Or
that you've a non-compliant compiler. Post the code.

john
 
R

Ryan D. Lucey

here's the code .. compiled using visual c++ 6.0

/ stomping.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include <iostream>
#include <string>
#include <fstream>

using namespace std;


class testClass
{


int a;

public:

testClass(int = 1);
virtual ~testClass();

void setData(int);
int getData() { return(a); }
void writeData( string fileName );

friend ostream& operator<<(ostream& , const testClass& );
};

ostream& operator<<( ostream& outStream, const testClass& object)
{
outStream << "Value of object: " << object.a << std::endl;

return outStream;
}

testClass::testClass(int a_)
{
setData(a_);
}

testClass::~testClass()
{

}

void testClass::setData(int a_)
{
a = a_;
}

void testClass::writeData( std::string fileName )
{
ofstream outPut;



outPut.open( fileName.c_str());


outPut.close();
}


int main(int argc, char* argv[])
{
testClass object1(30);
testClass object2(25);

object1.writeData("c:\\object1.txt");
object2.writeData("c:\\object2.txt");

cout << object1;




return 0;
}


errors:

--------------------Configuration: stomping - Win32
Debug--------------------
Compiling...
stomping.cpp
E:\Projects\stomping\stomping.cpp(33) : error C2248: 'a' : cannot access
private member declared in class 'testClass'
E:\Projects\stomping\stomping.cpp(17) : see declaration of 'a'
E:\Projects\stomping\stomping.cpp(74) : error C2593: 'operator <<' is
ambiguous
Error executing cl.exe.

stomping.exe - 2 error(s), 0 warning(s)
 
J

John Harrison

Ryan D. Lucey said:
here's the code .. compiled using visual c++ 6.0

/ stomping.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include <iostream>
#include <string>
#include <fstream>

using namespace std;


class testClass
{


int a;

public:

testClass(int = 1);
virtual ~testClass();

void setData(int);
int getData() { return(a); }
void writeData( string fileName );

friend ostream& operator<<(ostream& , const testClass& );
};

ostream& operator<<( ostream& outStream, const testClass& object)
{
outStream << "Value of object: " << object.a << std::endl;

return outStream;
}

testClass::testClass(int a_)
{
setData(a_);
}

testClass::~testClass()
{

}

void testClass::setData(int a_)
{
a = a_;
}

void testClass::writeData( std::string fileName )
{
ofstream outPut;



outPut.open( fileName.c_str());


outPut.close();
}


int main(int argc, char* argv[])
{
testClass object1(30);
testClass object2(25);

object1.writeData("c:\\object1.txt");
object2.writeData("c:\\object2.txt");

cout << object1;




return 0;
}

Compile successfully with VC++ 7.1. VC++ 6 is bugged. This might be a
service pack issue, if you haven't already, upgrade to SP5.

I don't have a copy of VC++ 6 to test but try the following as workarounds.

1) declare the function inline

class testClass
{
...
friend ostream& operator<<(ostream& outStream, const testClass& object)
{
outStream << "Value of object: " << object.a << std::endl;
}
};


2) declare the function in the std namespace

namespace std
{
ostream& operator<<(ostream& , const testClass& );
}

class testClass
{
...
friend ostream& std::eek:perator<<(ostream& , const testClass& );
};

namespace std
{
ostream& operator<<(ostream& outStream , const testClass& object)
{
outStream << "Value of object: " << object.a << std::endl;
}
}

I pretty sure one of those works, because it definitely is possible to do
this in VC++ 6. But it a while since I've had to do this in VC++ 6 so I
can't quite recall.

john
 
M

Michael Fawcett

// lots of code
*snip*

Compile successfully with VC++ 7.1. VC++ 6 is bugged. This might be a
service pack issue, if you haven't already, upgrade to SP5.

I don't have a copy of VC++ 6 to test but try the following as workarounds.

1) declare the function inline

class testClass
{
...
friend ostream& operator<<(ostream& outStream, const testClass& object)
{
outStream << "Value of object: " << object.a << std::endl;
}
};


2) declare the function in the std namespace

namespace std
{
ostream& operator<<(ostream& , const testClass& );
}

class testClass
{
...
friend ostream& std::eek:perator<<(ostream& , const testClass& );
};

namespace std
{
ostream& operator<<(ostream& outStream , const testClass& object)
{
outStream << "Value of object: " << object.a << std::endl;
}
}

I pretty sure one of those works, because it definitely is possible to do
this in VC++ 6. But it a while since I've had to do this in VC++ 6 so I
can't quite recall.

john


Visual C++ 6.0 didn't handle friends correctly until SP3. Download SP5 as
soon as you can.

-Michael
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,055
Latest member
SlimSparkKetoACVReview

Latest Threads

Top