Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Member Function Pointer Giving multiple errors

I have a member function pointer inside of my MethodPtr class. That’s public and is declared like this:

void (Method::*func)() = nullptr;

It’s giving me multiple errors and I’m unsure why. These errors are

‘func’: unknown override specifier

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

‘Method’: is not a class or namespace name

‘methodptr’: unkown override specifier

missing type specifier

syntax error: ")"

syntax error: missing ‘)’ before identifier ‘func’

unexpected token(s) preceding ‘;’

These errors are shown in the error list and show duplicates. Here’s
my code:

Method.h

#pragma once
#include "Methodptr.h"
#include <iostream>

class Method {
public:
    Method();
    void doSomething();
    MethodPtr methodptr;
};

Method.cpp

#include "Method.h"

Method::Method() { 
        //methodptr.func = &Method::doSomething;
}

void Method::doSomething() {
    std::cout << "Did something!" << std::endl;
}

The program crashes with the constructor expression commented out.

MethodPtr.h

#pragma once
#include "Method.h"

class MethodPtr {
public:
    void (Method::* func)() = nullptr;
};

Main.cpp

#include <iostream>
#include <fstream>
#include "Method.h"

int main() {
    Method method;
    //method.doSomething();
}

At first, I didn’t know that member function pointers were a thing. So, I fixed that, and created a separate project to test it. I’ve continued to get this error since.

I don’t want to use lambdas or std::function, unless there is no other way.

Currently, I’m just trying to figure out what I’m doing wrong here. I did get std::function to work when I used std::bind() and std::placeholder along with it.

>Solution :

You need to uncomment the line in the Method constructor or use the member initializer list to initialize methodptr:

Method::Method() : methodptr{&Method::doSomething} {}

and you also need to actually use the member function pointer.

It could look like this:

#include <iostream>

class Method;           // forward declaration

class MethodPtr {
public:
    void (Method::*func)() = nullptr;
};

class Method {
public:
    Method();
    void doSomething();
    void call();             // will use methodptr
    MethodPtr methodptr;
};

Method::Method() : methodptr{&Method::doSomething} {}

void Method::call() {
    // dereferencing the function pointer to call it on `this`:
    (this->*methodptr.func)();
}

void Method::doSomething() {
    std::cout << "Did something!" << std::endl;
}

int main() {
    Method method;
    method.call();
}

Demo

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading