Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 8351
  • 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
Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
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

Featured Post

Concerto Cloud for Software Providers & ISVs

Can Concerto Cloud Services help you focus on evolving your application offerings, while delivering the best cloud experience to your customers? From DevOps to revenue models and customer support, the answer is yes!

Learn how Concerto can help you.

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