problems with standard header | | |
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 | | | | re: problems with standard header
"Ryan D. Lucey" <mojokid@comcast.net> wrote in message
news:3f4842f7$0$10462$9a6e19ea@news.newshosting.co m...[color=blue]
> 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[/color]
the[color=blue]
> class although the overloaded function is declared as a friend. It[/color]
compiles[color=blue]
> fine however if I add the .h extension to the headers <iostream> and
> <iomanip>
>
> What gives ?
>[/color]
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 | | | | re: problems with standard header
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" <mojokid@comcast.net> wrote in message
news:3f4842f7$0$10462$9a6e19ea@news.newshosting.co m...[color=blue]
> 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[/color]
the[color=blue]
> class although the overloaded function is declared as a friend. It[/color]
compiles[color=blue]
> fine however if I add the .h extension to the headers <iostream> and
> <iomanip>
>
> What gives ?
>
>
> Ryan
>
>[/color] | | | | re: problems with standard header
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" <john_andronicus@hotmail.com> wrote in message
news:bi9gr9$6ri58$1@ID-196037.news.uni-berlin.de...[color=blue]
>
> "Ryan D. Lucey" <mojokid@comcast.net> wrote in message
> news:3f4842f7$0$10462$9a6e19ea@news.newshosting.co m...[color=green]
> > ok I'm trying out a small program using operator overloading from the[/color][/color]
book[color=blue][color=green]
> > C++ How To Program by Deitel Deitel. In their code they use the old[/color][/color]
style[color=blue][color=green]
> > headers
> > and the program compiles and runs as it should, but if I switch to the[/color][/color]
new[color=blue][color=green]
> > style headers and add 'using namespace std' and change nothing else
> > I get errors saying that the class object cannot access private data in[/color]
> the[color=green]
> > class although the overloaded function is declared as a friend. It[/color]
> compiles[color=green]
> > fine however if I add the .h extension to the headers <iostream> and
> > <iomanip>
> >
> > What gives ?
> >[/color]
>
> Hard to say without seeing the code. My guess would be that you've[/color]
declared[color=blue]
> the friendship wrongly, remember operator<< is now in the std namespace.[/color]
Or[color=blue]
> that you've a non-compliant compiler. Post the code.
>
> john
>
>[/color] | | | | re: problems with standard header
"Ryan D. Lucey" <mojokid@comcast.net> wrote in message
news:3f484c32$0$10454$9a6e19ea@news.newshosting.co m...[color=blue]
> 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;
> }
>
>[/color]
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 | | | | re: problems with standard header
"John Harrison" <john_andronicus@hotmail.com> wrote in message
news:bi9kvg$7310m$1@ID-196037.news.uni-berlin.de...[color=blue]
>
> "Ryan D. Lucey" <mojokid@comcast.net> wrote in message
> news:3f484c32$0$10454$9a6e19ea@news.newshosting.co m...[color=green]
> > here's the code .. compiled using visual c++ 6.0
> >[/color][/color]
// lots of code
*snip*
[color=blue]
> 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[/color]
workarounds.[color=blue]
>
> 1) declare the function inline
>
> class testClass
> {
> ...
> friend ostream& operator<<(ostream& outStream, const testClass&[/color]
object)[color=blue]
> {
> 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
>[/color]
Visual C++ 6.0 didn't handle friends correctly until SP3. Download SP5 as
soon as you can.
-Michael | | | | re: problems with standard header
Got the service pack, all is well!
Thanks guys.
Ryan
"Michael Fawcett" <xmikefx@xintelgamesx.xcomx> wrote in message
news:b8_1b.79419$K4.3560605@twister.tampabay.rr.co m...[color=blue]
> "John Harrison" <john_andronicus@hotmail.com> wrote in message
> news:bi9kvg$7310m$1@ID-196037.news.uni-berlin.de...[color=green]
> >
> > "Ryan D. Lucey" <mojokid@comcast.net> wrote in message
> > news:3f484c32$0$10454$9a6e19ea@news.newshosting.co m...[color=darkred]
> > > here's the code .. compiled using visual c++ 6.0
> > >[/color][/color]
>
>
> // lots of code
> *snip*
>
>[color=green]
> > 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[/color]
> workarounds.[color=green]
> >
> > 1) declare the function inline
> >
> > class testClass
> > {
> > ...
> > friend ostream& operator<<(ostream& outStream, const testClass&[/color]
> object)[color=green]
> > {
> > 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[/color][/color]
do[color=blue][color=green]
> > 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
> >[/color]
>
>
> Visual C++ 6.0 didn't handle friends correctly until SP3. Download SP5 as
> soon as you can.
>
> -Michael
>
>[/color] |  | | | | /bytes/about
We are a network of experts and professionals in IT and software development that help one another with answers to tough questions and share insights.
Get the best answers to your questions from over 226,510 network members.
|