invalid conversion from `const void*' to `void*'

P

philwozza

Im trying to implement a THREAD class that encapsulates a posix thread.
Here is an outline of my THREAD class.

class THREAD {

public:
// returns 1 if thread sucessfully started
int Start(void* = NULL);

// other public functions

protected:
virtual void* Run(void*);

};

int THREAD::Start(void* param) {
if (!Started) {
Param = param;
if (ThreadHandle =
(HANDLE)_beginthreadex(NULL,0,ThreadFunction,this,0,&ThreadID))
{
if (Detached)
{
CloseHandle(ThreadHandle);
}
}
Started = TRUE;

}
return Started;

}

Once the thread is started it basically calls Run() inside the
ThreadFunction.

I have a class called HELLO that inherits from the THREAD class that
simply prints "hello" to the screen.

class HELLO : public THREAD {

protected:
virtual void* Run(void*);
};


void* HELLO::Run(void* param) {
char* message = param;
for (int i=0;i<11;i++)
{
printf("%s\n", message);
}
return NULL;
}

Problem: when i create a new instance of HELLO and attempt to call
Start("hi") i get the following error under gcc 3.3.5

error: invalid conversion from `const void*' to `void*'
error: initializing argument 1 of `int THREAD::Start(void*)'

Under VC++ 8.0 the code works fine. Can anyone suggest a resolution.
 
C

cbmanica

philwozza said:
Problem: when i create a new instance of HELLO and attempt to call
Start("hi") i get the following error under gcc 3.3.5

error: invalid conversion from `const void*' to `void*'
error: initializing argument 1 of `int THREAD::Start(void*)'

Under VC++ 8.0 the code works fine.

In C++, string literals are of type const char [], so gcc is correct
and the M$ product is technically wrong (as usual). You can either
turn "hi" into a modifiable array of characters,

char foo[]="hi";
instance.Start( foo );

or, since you do not actually modify the characters in the strings you
pass, cast away the const:

instance.Start( const_cast<char*>("hi") );

, although this approach is a pretty sure path to tears down the road.
I recommend not doing it.
 
I

Ivan Vecerina

....
: int Start(void* = NULL);
....
: Problem: when i create a new instance of HELLO and attempt to call
: Start("hi") i get the following error under gcc 3.3.5
:
: error: invalid conversion from `const void*' to `void*'
: error: initializing argument 1 of `int THREAD::Start(void*)'
:
: Under VC++ 8.0 the code works fine. Can anyone suggest a resolution.
VC++ is wrong.
A string literal has type char const[N],
which implicitly get converted to char const*.
The latter can implicitly be converted to a void const*.

So an explicit cast is needed.
IMO the easiest in such a context is to use a C-style cast:
Start((void*)"hi");
With a C++ cast, you'd write:
Start( const_cast<char*>("hi") );
 

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,776
Messages
2,569,603
Members
45,189
Latest member
CryptoTaxSoftware

Latest Threads

Top