| Title: | C++ |
| Notice: | Read 1.* and use keywords (e.g. SHOW KEY/FULL KIT_CXX_VAX_VMS) |
| Moderator: | DECCXX::AMARTIN |
| Created: | Fri Nov 06 1987 |
| Last Modified: | Thu Jun 05 1997 |
| Last Successful Update: | Fri Jun 06 1997 |
| Number of topics: | 3604 |
| Total number of notes: | 18242 |
I'm looking for help on a problem I'm seeing with DEC C++ under OpenVMS.
CXX/VERSION gives me:
DEC C++ V5.5-017 on OpenVMS Alpha V6.2-1H3
although I've seen the same behavior under C++ V5.4.
The project I'm working on makes extensive use of the templated list classes
(e.g., RWTIsvSlist<T>) provided by Rogue Wave's Tools.h++ library. I have
compiled the library myself (version 7.00), with very little problem.
I'm using the defaults for template instantiation, meaning that templates
are instantiated automatically into the repository directory, and then
resolved uniquely by CXXLINK. The problem is that CXXLINK is complaining
about certain undefined symbols that are, to the best of my knowledge, not
legitimate C++ external symbols. Here's an example:
%LINK-I-UDFSYM, RWTValSlist< >::RWTValSlist(const RWTValSlist< > &)
and then (split for easy reading)
%LINK-W-USEUNDEF, undefined symbol
RWTValSlist< >::RWTValSlist(const RWTValSlist< > &) referenced
in psect $LINK$ offset %X00000700
in module MOPHYDEVICE file
DKA0:[DDUVAL.QUASAR.VMS-PORT.QUASAR.SERVER.MANAGEDOBJECTS]MANAGEDOBJECTS.OLB;1
As you can see, C++ appears to believe that I'm instantiating a template
class using a null type parameter. A search of the listing file for
MOPhyDevice.cpp doesn't show such an instantiation, and I would have expected
the compiler to complain if it found such a thing.
Any clues to what I might be doing wrong?
Thanks,
Dan Duval
Storage Subsystems
| T.R | Title | User | Personal Name | Date | Lines |
|---|---|---|---|---|---|
| 3562.1 | we need some clues | DECCXX::MITCHELL | Thu May 08 1997 11:01 | 12 | |
I talked to one of our template experts about this about how we might get a clue about what's going on without having to get all of your sources. Initially could you search your code and provide source snippets for all places in your code where you instantiate RWTValSlist. This might tell us what types the template is instantiated with and indicate which instantiation is causing the problem. Also could you search CXX$DEMANGLER_DB in your repository directory ([.CXX_REPOSITORY] by default) for RWTValSlist and provide what you find. | |||||
| 3562.2 | relevant information provided separately | SUBSYS::DDUVAL | Thu May 08 1997 17:55 | 19 | |
It proved difficult simply to extract all of the places where an RWTValSlist
was instantiated, since in some cases such a list gets created as part of
creation of a larger data structure. What I've done instead is put the
results of "CXX/LIST/SHO=ALL" of module MOPHYDEVICE (since that's one in
which the symbol comes up undefined) in:
SUBSYS::R5$USER1:[DDUVAL.PUBLIC]
The C++ source file (.CPP) is in there as well.
I've also put in there a file called RWTVALSLIST.SEA, which contains the
results of searching CXX$DEMANGLER_DB for RWTValSlist.
Finally, if it would make this easier to track down, I could give you
access to the machine I use for building this image. Just let me
know.
Cheers,
Dan
| |||||
| 3562.3 | Fixed in T5.6 | DECC::FOLTAN | Thu May 15 1997 15:36 | 52 | |
Hi Dan,
The information you provided was very helpful, thanks!
The good news is that this problem is fixed in our
current development stream and should be coming your
way soon via DEC C++ T5.6.
Lois Foltan
DEC C++ Development
If you are interested I was able to reproduce the
problem with this small example:
//template.h
typedef enum {
DriveDead,
DriveDegraded
} DriveState;
template <class T> class R {
public:
void get(T p);
};
template <class T> void R<T>::get(T p) { return; }
//main.cxx
#include "template.h"
int main()
{
R<DriveState> r;
r.get(DriveDead);
return 0;
}
$ cxx main.cxx
$ cxxlink main.obj
typedef R< > __dummy_;
........^
%CXX-E-TEMPARGCOUNT, In this declaration, an incorrect number of arguments are s
upplied for the template "R".
at line number 2 in file GEM_C$:[FOLTAN.WORK.CXX_REPOSITORY]R___10DRIVESTATE.CXX
;1
%LINK-W-NUDFSYMS, 1 undefined symbol:
%LINK-I-UDFSYM, void R< >::get()
%LINK-W-USEUNDEF, undefined symbol void R< >::get() referenced
in psect $LINK$ offset %X00000020
in module MAIN file GEM_C$:[FOLTAN.WORK]MAIN.OBJ;7
| |||||
| 3562.4 | Is there a workaround? | CSC32::EHA | Flip | Wed May 21 1997 10:42 | 8 |
Hello Lois,
I have a customer that seems to be having the same problem. Is there a
workaround?
Thank you!
Al Eha
Digital Customer Support
| |||||