Re: Explicit Template Instantiation
gabe.heaf...@gmail.com schrieb:
However, I'm having compilation problems. I haven't done much C++ in
a while, and even when I did, I don't remember doing something of this
nature.
If I'm using the RogueWave vector implementations, it seems I need to
create and use vectors of longs differently than vectors of any of my
user-defined types (classes). As a result, I'm hoping to modify the
class template so that it looks, acts, feels, and tastes slightly
different for longs than it does for user-defined types.
I don't have a clue concerning these RogueWave vectors, but
the code is ill-formed, which I explain below.
First question: if I specify an explicit template for longs, can I
have it be derived from a different parent class than the rest of the
template? That sort of affects the rest of this discussion, I'm
pretty sure.
That is definitively the case, so your efforts are worthwile ;-)
using namespace std;
You should definitivly *not* put this using directive
into a public header. For further discussions on this
topic have a look at e.g.
http://www.gotw.ca/gotw/053.htm
template<long> class CArray4BuiltIns : public
RWTValOrderedVector<long> {
Two points: This is an neither a valid primary template
definition nor a valid specialization. If you want to
specialize a template, you must declare the primary
template *before* the specialization like this:
template<class T> class CArray4BuiltIns;
and the explicit specialization that you are attempting
to write must start with template<>, like this:
template<> class CArray4BuiltIns<long> : public
RWTValOrderedVector<long> {
....
};
public:
// list management
int Add(long &theValue);
int Delete(long &theValue);
It seems that you don't want to modify the argument,
so this should be either of
int Add(const long &theValue);
int Delete(const long &theValue);
or probably more reasonable:
int Add(long theValue);
int Delete(long theValue);
int DeleteIndex(int theIndex);
int Count();
I strongly propose to take advantage of C++
cv-qualifications. In this case Count() is
quite probably a const function:
int Count() const;
private:
enum ResultType {kSuccess = 0x0, kFailure = 0x1};
You can use this enum, if you like, but why not
using the fundamental C++ type bool, which has
exactly the same ordinal value range
(false<=>0, true<=>1)? Using bool would make
it reasonable to change above signatures to read:
bool Add(long theValue); // Removed reference
bool Delete(long theValue); // Removed reference
bool DeleteIndex(int theIndex);
(if I correctly understand the meaning of the return
values).
};
OK, this is now the definition of the *primary*
template:
template<class T> class CArray4BuiltIns : public
RWTPtrOrderedVector<T> {
public:
// list management
int Add(T &theValue);
int Delete(T &theValue);
int DeleteIndex(int theIndex);
int Count();
Same issue concerning const-qualification and
argument types.
private:
enum ResultType {kSuccess = 0x0, kFailure = 0x1};
Same issue concerning choice to use bool.
template<long> inline int CArray4BuiltIns<long>::Add(long theValue)
Invalid definition syntax (Leading template<long> must not exist,
the argument type does not match the original declaration. Correct:
inline int CArray4BuiltIns<long>::Add(long& theValue)
given your original declaration or
inline int CArray4BuiltIns<long>::Add(long theValue)
given my proposed fix of the original declaration.
{
return (insert(theValue) ? kSuccess : kFailure);
According to:
http://docs.sun.com/source/819-3702/TVa_5824.htm
this function returns a bool, which further seems to
support my idea to switch to bool instead (If this
signature change would be feasible for you).
template<long> inline int CArray4BuiltIns<long>::Delete(long theValue)
Same definition problem. Should be:
inline int CArray4BuiltIns<long>::Delete(long& theValue)
or
inline int CArray4BuiltIns<long>::Delete(long theValue)
given the proposed change.
template<class T> inline int CArray4BuiltIns<T>::Delete(T &theValue)
{
return (remove(theValue) ? kSuccess : kFailure);
Due to template lookup rules, a dependent base class
is not considered for unqualified name look up. You need
to qualify the call, like this:
return (RWTPtrOrderedVector<T>::remove(theValue) ? kSuccess :
kFailure);
or this:
return (this->remove(theValue) ? kSuccess : kFailure);
(which enables polymorphic call, if there would be one)
}
template<class T> inline int CArray4BuiltIns<T>::DeleteIndex(int
theIndex)
{
return (removeAt(theIndex) ? kSuccess : kFailure);
Same qualification issue:
return (RWTPtrOrderedVector<T>::removeAt(theIndex) ? kSuccess :
kFailure);
/**
* CArray4BuiltIns::Count
* RETURN: either kSuccess or kFailure
*/
template<class T> inline int CArray4BuiltIns<T>::Count()
{
return entries();
The qualification is also needed here:
return RWTPtrOrderedVector<T>::entries();
What am I doing wrong? How can I make it so that a CArray4Builtins is
different for longs than it is for user-defined types? Really, the
only method I absolutely have to get to work is the Add() method, but
the compiler doesn't seem to like it when I use the RogueWave pointer-
based vector implementation and I give it a long to store.
As shown above. But frankly, if you want to come near
to a the current Standard Container Library, you should
definitively *not* use the RogueWave containers, they
seem to have a quite different interface than the current
C++ standard requires for its containers.
HTH & Greetings from Bremen,
Daniel Kr?gler
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]