Bug of the week #11


Welcome to the next pikoTutorial !

The error we’re handling today is a C++ compilation error:

invalid use of non-static member function

What does it mean?

It often occurs when the compiler encounters a place in the code where it would normally expect a static member function, but the actual function is not static. Let’s say for example, that we have a function which takes a function pointer to some other function and calls it:

C++
void RunFunction(void (*func)())
{
    func();
}

If you create a SomeClass class with a non-static Run function and try to pass it to the RunFunction function using the range operator like below:

C++
struct SomeClass
{
    void Run()
    {
        std::cout << "Running..." << std::endl;
    }
};

int main()
{
    RunFunction(SomeClass::Run);
}

the compiler will throw an error:

error: invalid use of non-static member function ‘void SomeClass::Run()’

How to fix it?

The easiest way is to just make Run function static, by adding static keyword to its definition:

C++
static void Run()

However, if you can’t make that function static, you would have to adjust the RunFunction function to accept some callable object instead of a raw function pointer:

C++
void RunFunction(std::function<void()> func)
{
    func();
}

And bind SomeClass::Run function to a specific object instance using std::bind:

C++
SomeClass instance;
RunFunction(std::bind(&SomeClass::Run, instance));

Or a simple lambda:

C++
SomeClass instance;
RunFunction([&instance]{ instance.Run(); });