Solved

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

Posted on 2004-09-20
11
8,030 Views
Last Modified: 2012-06-21
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
Comment
Question by:jewee
11 Comments
 
LVL 86

Expert Comment

by:jkr
ID: 12102531
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
 
LVL 8

Expert Comment

by:mnashadka
ID: 12102560
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
 
LVL 13

Expert Comment

by:SteH
ID: 12102610
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
 
LVL 30

Accepted Solution

by:
Axter earned 500 total points
ID: 12103243
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
 
LVL 30

Expert Comment

by:Axter
ID: 12103248
0
Maximize Your Threat Intelligence Reporting

Reporting is one of the most important and least talked about aspects of a world-class threat intelligence program. Here’s how to do it right.

 
LVL 39

Expert Comment

by:itsmeandnobodyelse
ID: 12103922
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
 
LVL 30

Expert Comment

by:Axter
ID: 12104231
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
 
LVL 39

Expert Comment

by:itsmeandnobodyelse
ID: 12104490
@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
 
LVL 30

Expert Comment

by:Axter
ID: 12105121
>>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
 
LVL 39

Expert Comment

by:itsmeandnobodyelse
ID: 12105307
@axter:

Thanks. I'll give it a try.
0

Featured Post

How your wiki can always stay up-to-date

Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
- Increase transparency
- Onboard new hires faster
- Access from mobile/offline

Join & Write a Comment

Written by John Humphreys C++ Threading and the POSIX Library This article will cover the basic information that you need to know in order to make use of the POSIX threading library available for C and C++ on UNIX and most Linux systems.   [s…
Introduction This article is a continuation of the C/C++ Visual Studio Express debugger series. Part 1 provided a quick start guide in using the debugger. Part 2 focused on additional topics in breakpoints. As your assignments become a little more …
The goal of the tutorial is to teach the user how to use functions in C++. The video will cover how to define functions, how to call functions and how to create functions prototypes. Microsoft Visual C++ 2010 Express will be used as a text editor an…
The viewer will learn additional member functions of the vector class. Specifically, the capacity and swap member functions will be introduced.

757 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

22 Experts available now in Live!

Get 1:1 Help Now