Improve company productivity with a Business Account.Sign Up

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 8429
  • Last Modified:

Cannot declare member function to have static linkage - -HELP!

I am trying to catch a signal and am having problems with the handler.  I declared a static function to handle the signal, but I keep on getting this error:

"Cannot declare member function 'void SignalThread::messageHandler(int) to have static linkage.  
(This class inherits from QThread)

Here is the some of the code:

void SignalThread::run()
{
  for (;;)
  {
    signalServerFlag = 0;
    signal(SIGUSR1, messageHandler);
  }
}
static void SignalThread::messageHandler(int signum)
{
    signalServerFlag = 1;
    window->show();
    return;
}


0
jewee
Asked:
jewee
1 Solution
 
jkrCommented:
If the message handler is not static in the mase class, you can't make it static in a derived class.

Check out the generic solution at http://www.codeproject.com/win32/callback_adapter.asp ("Use member functions for C-style callbacks and threads - a general solution"), this applies also for non-windows programs.
0
 
mnashadkaCommented:
If the messageHandler function is not a member of the base class, the "static" keyword needs to be in the class declaration, and not in the definition:

class SignalThread : public QThread
{
...
static void messageHandler(int signum);
...
};

And then in the cpp file:
void SignalThread::messageHandler(int signum)
{
}

0
 
SteHCommented:
And another hint:
You call window->show ();
But window is not a local variable. If it is a member of SignalThread it must be static as well be accessible from a static function.
0
Free Tool: IP Lookup

Get more info about an IP address or domain name, such as organization, abuse contacts and geolocation.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 
AxterCommented:
Example code posted in new associated question:

class SignalThread
{
public:
      SignalThread(int signum);
      ~SignalThread();
      static void messageHandler(int signum);
      void show(){}
private:
      static std::map<int,SignalThread*> MyList;
      int My_signum;
};


SignalThread::SignalThread(int signum)
{
      My_signum = signum;
      MyList[My_signum] = this;
}

SignalThread::~SignalThread()
{
      MyList.erase(My_signum);
}

std::map<int,SignalThread*> SignalThread::MyList;

void SignalThread::messageHandler(int signum)
{
      SignalThread* window = MyList[signum];
//   signalServerFlag = 1;
   window->show();
   return;
}



int main(){
      SignalThread SignalThread1(100);
      SignalThread SignalThread2(22);
      SignalThread::messageHandler(22);
      SignalThread::messageHandler(100);
      return 0;
}
0
 
AxterCommented:
0
 
itsmeandnobodyelseCommented:
Or that ;-)

http://www.experts-exchange.com/Programming/Programming_Languages/Cplusplus/Q_21137712.html

Replace 'MyThread' by 'SignalThread' and 'signalHandler' by 'messageHandler'

Regards, Alex
0
 
AxterCommented:
itsmeandnobodyelse,
FYI:
I always use the short version of the links, not because I want to save typeing, but because if you click on the short version, you still get the same EE look that you're already in.

Example:
Old-Look
http://oldlook.experts-exchange.com:8080/Programming/Programming_Languages/Cplusplus/Q_21137645.html

New-Look
http://www.experts-exchange.com/Programming/Programming_Languages/Cplusplus/Q_21137645.html

Your-current-look
http:Q_21137645.html

Since I realy, realy, realy hate the new look, I post the short version, so as not to force the reader into a look they don't want.
0
 
itsmeandnobodyelseCommented:
@axter

it wasn't done purposely as i didn't know there is an old look.

how do i get a short link? Is there any accelerator or do i have to delete the path? And how to change to the old look?

Regards, Alex
0
 
AxterCommented:
>>it wasn't done purposely as i didn't know there is an old look.
I didn't think you did it intentional, that's why I posted it as an FYI :-)

>>how do i get a short link?
Just posted exactly as you see in the link I posted. (http:????????ID.html)


>>And how to change to the old look?

Just replace www to oldlook.

http://www.experts-exchange.com/Programming/Programming_Languages/Cplusplus
to
http://oldlook.experts-exchange.com/Programming/Programming_Languages/Cplusplus

The one bad thing about the oldlook, is that when you get an email notification, the email notification has links to the new look.

Also, recently, it looks like the search engine has been disabled for the oldlook.  I'm not sure if that's a temporary bug, or permanent.
0
 
itsmeandnobodyelseCommented:
@axter:

Thanks. I'll give it a try.
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.

Join & Write a Comment

Featured Post

Get your problem seen by more experts

Be seen. Boost your question’s priority for more expert views and faster solutions

Tackle projects and never again get stuck behind a technical roadblock.
Join Now