Solved

class def

Posted on 2000-02-14
11
270 Views
Last Modified: 2010-04-02
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
0
Comment
Question by:roverm
  • 7
  • 3
11 Comments
 
LVL 7

Expert Comment

by:KangaRoo
ID: 2521707
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
 
LVL 7

Expert Comment

by:KangaRoo
ID: 2521722
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
 
LVL 7

Expert Comment

by:KangaRoo
ID: 2523019
0
 
LVL 3

Expert Comment

by:LucHoltkamp
ID: 2523321
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
 
LVL 7

Expert Comment

by:KangaRoo
ID: 2523456
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
Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

 
LVL 7

Expert Comment

by:KangaRoo
ID: 2523469
>> HANDLE is not any of the allowed types
That is, it is allowed if it has external linkage, as in my example.
0
 
LVL 12

Author Comment

by:roverm
ID: 2530226
Sorry, still get errorsssssss!
like 'invalid template error'
0
 
LVL 12

Author Comment

by:roverm
ID: 2530228
Further, I'm trying to instanciate a new definition using TypeDef, NOT by using instanciating a class !

RoverM
0
 
LVL 7

Accepted Solution

by:
KangaRoo earned 100 total points
ID: 2530305
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
 
LVL 7

Expert Comment

by:KangaRoo
ID: 2534448
>> 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
 
LVL 12

Author Comment

by:roverm
ID: 2549912
Kangaroo:
You're right! It cannot be done!
So I'll give you the points!

D'Mzzl!
RoverM
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

What is C++ STL?: STL stands for Standard Template Library and is a part of standard C++ libraries. It contains many useful data structures (containers) and algorithms, which can spare you a lot of the time. Today we will look at the STL Vector. …
Go is an acronym of golang, is a programming language developed Google in 2007. Go is a new language that is mostly in the C family, with significant input from Pascal/Modula/Oberon family. Hence Go arisen as low-level language with fast compilation…
The viewer will learn how to user default arguments when defining functions. This method of defining functions will be contrasted with the non-default-argument of defining functions.
The viewer will be introduced to the member functions push_back and pop_back of the vector class. The video will teach the difference between the two as well as how to use each one along with its functionality.

919 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

12 Experts available now in Live!

Get 1:1 Help Now