Problem when std::function refers to member function

  • Context:
  • Thread starter Thread starter ORF
  • Start date Start date
  • Tags Tags
    Function Member
Click For Summary
SUMMARY

The forum discussion addresses an issue with using std::function to reference member functions in C++. The user encountered an error when trying to pass obj.one.ShowA directly to obj.two.ShowB, which was due to the lack of an object reference. The solution involves using a lambda function or std::bind to correctly reference the member function. The discussion also suggests that implementing ShowB as a member function of master_t could simplify the code.

PREREQUISITES
  • Understanding of C++ member functions and classes
  • Familiarity with std::function and lambda expressions
  • Knowledge of std::bind for binding member functions
  • Basic understanding of C++ error messages and debugging
NEXT STEPS
  • Learn about C++ lambda expressions and their usage
  • Explore std::bind and its applications in C++
  • Research best practices for class composition in C++
  • Investigate member function pointers and their syntax in C++
USEFUL FOR

C++ developers, software engineers working with object-oriented programming, and anyone looking to improve their understanding of function references and member function handling in C++.

ORF
Messages
169
Reaction score
18
Hi,

I have a class master_t which is composed by two other classes, dev_a, dev_b. I would like that a member function from the dev_b object (within master_t) could use a member function of dev_a object (within master_t). This is a minimal working code, where line 26 implements this feature.

[CODE lang="cpp" title="Minimal working example" highlight="26"]class dev_a
{
public:
int a = {1};
void ShowA( ){ std::count << "dev_a::a = " << a << '\n'; return; }
};

class dev_b
{
public:
int b = {2};
void ShowB( std::function<void(void)> ShowA ){ std::count << "dev_b::b = " << b << '\n'; ShowA(); return; }
};

class master_t
{
public:
dev_a one;
dev_b two;
};

// Driver code
int main()
{
master_t obj;
obj.two.ShowB( [&](){ obj.one.ShowA(); return;} );
return 0;
}[/CODE]

I naively tried first with obj.two.ShowB( obj.one.ShowA ); but I got the following error

[CODE lang="cpp" title="Error message"]error: no matching function for call to ‘dev_b::ShowB(<unresolved overloaded function type>)’
obj.two.ShowB( obj.one.ShowA );[/CODE]

I have two questions:
a) The cause of the error is because when passing the function like obj.two.ShowB( obj.one.ShowA ); is missing the reference to the actual object obj.one?
b) Would it be better to implement the function dev_b::ShowB as member function of master_t instead, so it can have access to both dev_a and dev_b objects?

Thank you for your time. Any comment is welcome.

Cheers,
ORF
 
Technology news on Phys.org
Your code worked fine for me, and produced this output:
Code:
dev_b::b = 2
dev_a::a = 1

Maybe I am missing the point of your question ... ?

It seems simpler to me to implement ShowB() similar to how ShowA() is implemented. That would eliminate the need for the convoluted code of line 26 - obj.two.ShowB( [&](){ obj.one.ShowA(); return;} );. This line truly deserves some commenting.

To make your code compile and run, I added the following lines at the top.
C++:
#include <iostream>
#include <functional>
using std::cout;
using std::function;
 
Last edited:
ORF said:
The cause of the error is because when passing the function like obj.two.ShowB( obj.one.ShowA ); is missing the reference to the actual object obj.one?
That is correct. You can use a lambda to capture and call the object, or you can use std::bind, for example like
[CODE title="C++"]obj.two.ShowB( std::bind(&dev_a::ShowA, &obj.one) );[/CODE]
 
  • Like
Likes   Reactions: ORF and jim mcnamara

Similar threads

  • · Replies 36 ·
2
Replies
36
Views
6K
  • · Replies 11 ·
Replies
11
Views
2K
Replies
6
Views
2K
  • · Replies 8 ·
Replies
8
Views
2K
Replies
3
Views
2K
  • · Replies 57 ·
2
Replies
57
Views
5K
  • · Replies 22 ·
Replies
22
Views
4K
  • · Replies 4 ·
Replies
4
Views
3K
  • · Replies 36 ·
2
Replies
36
Views
3K
  • · Replies 6 ·
Replies
6
Views
12K