By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
426,060 Members | 1,906 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 426,060 IT Pros & Developers. It's quick & easy.

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

P: n/a
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.

May 12 '06 #1
Share this Question
Share on Google+
3 Replies


P: n/a

philwozza wrote:

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.

May 12 '06 #2

P: n/a
"philwozza" <ph****@uk-businessdirectory.co.uk> wrote in message
news:11**********************@g10g2000cwb.googlegr oups.com...
....
: 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") );
--
http://ivan.vecerina.com/contact/?subject=NG_POST <- email contact form
May 12 '06 #3

P: n/a
thanks for cleaning that up.

May 13 '06 #4

This discussion thread is closed

Replies have been disabled for this discussion.