class def

I receive an error when I try this:

template <typename HANDLE _Init=NULL>
class CMyClass
{
public:
        CMyClass()
        {
                m_hHanlde = _Init;
        }
protected:
        HANDLE m_hHandle;
};

Now to define a specility of the class:

typedef CMyClass<-1> CMyOtherClass;

This is where the compiler gives an error: a signed int cannot be converted/casted to a void* (which is a HANDLE)

typedef CMyClass<0xFFFFFFFF> CMyOtherClass;

Doesn't work either !

Anybody knows the answer ?

grtx, RoverM
LVL 12
rovermAsked:
Who is Participating?
 
KangaRooConnect With a Mentor Commented:
True. A non-type argument of pointer type must be a pointer to an object with external linkage.

#include <windows.h>

template<HANDLE* h>
class MyClass {};

extern HANDLE myhandle;

typedef MyClass<&myhandle> Something;

void f()
{
   MyClass<&myhandle> mc;
}
0
 
KangaRooCommented:
In short, non-type template parameters must either be some form of const expression or a pointer/reference to an object with external linkage.

You would need a declaration:
  extern HANDLE MyHandle;
a definition
  HANDLE MyHandle = -1;

Parameters for your template must always heave external linkage:

extern HANDLE hGl;
void f()
{
   HANDLE hLc;
   CMyClass<hLc> cm1; // error
   CMyClass<hGl> cm2; // ok

   //....  
}
0
 
KangaRooCommented:
More precisely (from '96 Draft):
==========================================
3 A non-type template-parameter shall have one of the following (option-
  ally cv-qualified) types:

  --integral type, accepting an integral constant expression as an argu-
    ment,

  --enumeration  type,  accepting  an integral constant expression as an
    argument,

  --pointer to object, accepting an address constant  expression  desig-
    nating a named object with external linkage,

  --reference  to  object,  accepting an lvalue expression designating a
    named object with external linkage,

  --pointer to function, accepting an  expression  of  type  pointer  to
    function designating a function with external linkage,

  --reference  to function, accepting an lvalue expression designating a
    function with external linkage,

  --pointer to member, accepting an address constant  expression  desig-
    nating a named member of a class.
==========================================
0
Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

 
KangaRooCommented:
0
 
LucHoltkampCommented:
Kangaroo, the parameter that roverm uses IS a constant expression, of course it must be a parameter that is known during compile-time, but that is the case in his example. So that is not the source of the problem.
Try to cast it explicitly to HANDLE (void*) this will solve you're problem.
Luc
0
 
KangaRooCommented:
HANDLE is not any of the allowed types (see above). A HANDLE is typedef-ed as a void*, so only void* (HANDLE's) with external linkage can be used as parameter for the template.
Explicit casting to HANDLE will not solve the problem.
0
 
KangaRooCommented:
>> HANDLE is not any of the allowed types
That is, it is allowed if it has external linkage, as in my example.
0
 
rovermAuthor Commented:
Sorry, still get errorsssssss!
like 'invalid template error'
0
 
rovermAuthor Commented:
Further, I'm trying to instanciate a new definition using TypeDef, NOT by using instanciating a class !

RoverM
0
 
KangaRooCommented:
>> I'm trying to instanciate a new definition using TypeDef
You can not instantiate a tmplate specialization with a typedef, if that is what you are trying to do.
0
 
rovermAuthor Commented:
Kangaroo:
You're right! It cannot be done!
So I'll give you the points!

D'Mzzl!
RoverM
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.