namespace question

J

John

Hi all:

I am using a code from third party. I write my own part and add it to
that code and compile together.
I try to use "vector" in my program. So I add "#include <vector>" to
my program.
But when I compile my program together with the code from the third
party,
the compiler reports error: redefinition of `class vector'.

I look at the code from the third party and find that in one file of
that code,
"class vector" is defined for other purpose.
I can not modify the code from the third party, because it may make
the situation worse.
What should I do to my own program to solve the name confliction
problem?

Thanks a lot.

John
 
S

Sharad Kala

John said:
Hi all:

I am using a code from third party. I write my own part and add it to
that code and compile together.
I try to use "vector" in my program. So I add "#include <vector>" to
my program.
But when I compile my program together with the code from the third
party,
the compiler reports error: redefinition of `class vector'.

I look at the code from the third party and find that in one file of
that code,
"class vector" is defined for other purpose.
I can not modify the code from the third party, because it may make
the situation worse.
What should I do to my own program to solve the name confliction
problem?

Don't write using namesapce std; in your code. You will need to refer to the
standard vector class as std::vector then.
 
R

Rolf Magnus

John said:
Hi all:

I am using a code from third party. I write my own part and add it to
that code and compile together.
I try to use "vector" in my program. So I add "#include <vector>" to
my program.
But when I compile my program together with the code from the third
party, the compiler reports error: redefinition of `class vector'.

I look at the code from the third party and find that in one file of
that code, "class vector" is defined for other purpose.
I can not modify the code from the third party, because it may make
the situation worse.
What should I do to my own program to solve the name confliction
problem?

The C++ standard class vector is in namespace std, so unless your 3rd
party library puts it there, too, there shouldn't be a name conflict.
After all, that's why namespaces exist.
If your compiler doesn't put vector into namespace std, then it is
probably quite outdated and you should consider using a more recent
one.
 
J

JKop

John posted:
Hi all:

I am using a code from third party. I write my own part and add it to
that code and compile together.
I try to use "vector" in my program. So I add "#include <vector>" to
my program.
But when I compile my program together with the code from the third
party,
the compiler reports error: redefinition of `class vector'.

I look at the code from the third party and find that in one file of
that code,
"class vector" is defined for other purpose.
I can not modify the code from the third party, because it may make
the situation worse.
What should I do to my own program to solve the name confliction
problem?

Thanks a lot.

John


namespace ThirdParty
{

#include <thirdpary>
}


std::vector
ThirdParty::vector


using namespace std


vector //refers to std::vector



-JKop
 
D

Dave Moore

Hi all:

I am using a code from third party. I write my own part and add it to
that code and compile together.
I try to use "vector" in my program. So I add "#include <vector>" to
my program.
But when I compile my program together with the code from the third
party,
the compiler reports error: redefinition of `class vector'.

I look at the code from the third party and find that in one file of
that code,
"class vector" is defined for other purpose.
I can not modify the code from the third party, because it may make
the situation worse.
What should I do to my own program to solve the name confliction
problem?

Well, the vector template that is defined in <vector> resides in
namespace std, so you should still be able to use it even in the
presence of the other vector class by specifying std::vector instead
of just vector. Note also that getting rid of using directives (e.g.
using namespace std) is generally a good idea, and will help identify
more name collisions between std::vector and your vendors' vector as
well.

HTH, Dave Moore
 
J

John

Hi all:

Thanks for reply.
In my program, I already use std::vector except the line: #include
<vector>.
Below is part of the error message:
In file included from
/usr/lib/gcc-lib/i386-linux/2.95.4/../../../../include/g++-3/vector.h:32,
from mycode.cc:35:
/usr/lib/gcc-lib/i386-linux/2.95.4/../../../../include/g++-3/stl_vector.h:153:
`vector' is not a template type
/usr/lib/gcc-lib/i386-linux/2.95.4/../../../../include/g++-3/stl_vector.h:154:
redefinition of `class vector'
mobile/god.h:117: previous definition here
/usr/lib/gcc-lib/i386-linux/2.95.4/../../../../include/g++-3/stl_vector.h:156:
invalid member template declaration `vector::_Base'
/usr/lib/gcc-lib/i386-linux/2.95.4/../../../../include/g++-3/stl_vector.h:158:
invalid member template declaration `vector::value_type'

mycode.cc is my own code. Line 35 is #include <vector>. mobile/god.h
is the code
from third party.
I also use list in my code, the compiler does not complain it.

Thanks a lot.

John
 
R

Rolf Magnus

John said:
Hi all:

Thanks for reply.
In my program, I already use std::vector except the line: #include
<vector>.
Below is part of the error message:
In file included from
/usr/lib/gcc-lib/i386-linux/2.95.4/../../../../include/g++-3/vector.h:32,
^^^^^^
This is your problem. The compiler is too old. g++ versions before 3.x
are not compliant wrt namespace std. They make std a synonym for the
global namespace. If possible, you should upgrade to gcc 3.x.
 
J

JKop

David Harmon posted:
You think so, huh? Where is the linker going to find the definition of
ThirdParty::vector or anything else?


Let's assume that there's:


ThirdParty.hpp
ThirdParty.cpp



In the Source Code file in which you wish to use this library, put:

namespace ThirdParty
{
#include <thirdparty.hpp>
}



And now, for the Source code file... Don't actually add it to your project
to be compiled; instead, do this: Make another file
"ThirdPartySourceCode.cpp", and put the following into it:


namespeace ThirdParty
{

using namespace ThirdParty;

#include <thirdparty.cpp>
}



-JKop
 

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

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,581
Members
45,056
Latest member
GlycogenSupporthealth

Latest Threads

Top