Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pointer to member function syntax

I'm trying to wrap my head around pointers to member functions and am stuck with this example:

#include <iostream>

class TestClass {
  public:
    void TestMethod(int, int) const;
};

void TestClass::TestMethod(int x, int y) const {
  std::cout << x << " + " << y << " = " << x + y << std::endl;
}

int main() {
  void (TestClass::*func)(int, int) const;
  func = TestClass::TestMethod;

  TestClass tc;
  tc.func(10, 20);

  return 0;
}

What I think the code should do:

  • In the first line of main I declare a pointer to a member function of class TestClass, which returns nothing/takes two int's and is declared const, called func.
  • The second line assigns the member-function TestMethod (of class TestClass) to func, which satisfies these criteria.
  • The forth line creates an TestClass-object called tc.
  • The fifth line tries to call the member function pointed to by func on the TestClass-object tc.

I get two compilation errors:

  • Instead of assigning TestClass::TestMethod to func. The compiler tries to call TestClass::TestMethod (even though it's not static, therefore throws an error):

    testPointerToMemberFunc.cpp:14:21: error: call to non-static member function without an object argument
      func = TestClass::TestMethod;
             ~~~~~~~~~~~^~~~~~~~~~
    
  • The compiler tries to call a function named func on tc, instead of the function, pointed to by func. To me this seems, like func isn't declared the right way (as a pointer to a member function):

    testPointerToMemberFunc.cpp:17:6: error: no member named 'func' in 'TestClass'
      tc.func(10, 20);
      ~~ ^
    

What am I doing wrong?


1 Answers

Simple syntax subtleties.

func = &TestClass::TestMethod;
//     ^ Missing ampersand to form a pointer-to-member

TestClass tc;
(tc.*func)(10, 20);
// ^^ Using the dot-star operator to dereference the pointer-to-member,
// while minding its awkward precedence with respect to the call operator.
like image 111
Quentin Avatar answered Dec 01 '25 08:12

Quentin



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!