By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
446,194 Members | 888 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 446,194 IT Pros & Developers. It's quick & easy.

problems with standard header

P: n/a
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
Jul 19 '05 #1
Share this Question
Share on Google+
6 Replies


P: n/a

"Ryan D. Lucey" <mo*****@comcast.net> wrote in message
news:3f***********************@news.newshosting.co m...
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
Jul 19 '05 #2

P: n/a
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 ?
"Ryan D. Lucey" <mo*****@comcast.net> wrote in message
news:3f***********************@news.newshosting.co m...
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

Jul 19 '05 #3

P: n/a
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)
"John Harrison" <jo*************@hotmail.com> wrote in message
news:bi************@ID-196037.news.uni-berlin.de...

"Ryan D. Lucey" <mo*****@comcast.net> wrote in message
news:3f***********************@news.newshosting.co m...
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

Jul 19 '05 #4

P: n/a

"Ryan D. Lucey" <mo*****@comcast.net> wrote in message
news:3f***********************@news.newshosting.co m...
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::operator<<(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
Jul 19 '05 #5

P: n/a
"John Harrison" <jo*************@hotmail.com> wrote in message
news:bi************@ID-196037.news.uni-berlin.de...

"Ryan D. Lucey" <mo*****@comcast.net> wrote in message
news:3f***********************@news.newshosting.co m...
here's the code .. compiled using visual c++ 6.0


// 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::operator<<(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
Jul 19 '05 #6

P: n/a
Got the service pack, all is well!
Thanks guys.

Ryan
"Michael Fawcett" <xm*****@xintelgamesx.xcomx> wrote in message
news:b8********************@twister.tampabay.rr.co m...
"John Harrison" <jo*************@hotmail.com> wrote in message
news:bi************@ID-196037.news.uni-berlin.de...

"Ryan D. Lucey" <mo*****@comcast.net> wrote in message
news:3f***********************@news.newshosting.co m...
here's the code .. compiled using visual c++ 6.0
// 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::operator<<(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

Jul 19 '05 #7

This discussion thread is closed

Replies have been disabled for this discussion.