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:
class TestClass
, which returns nothing/takes two int
's and is declared const
, called func.TestMethod
(of class TestClass
) to func
, which satisfies these criteria.TestClass
-object called tc.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?
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.