Problem when std::function refers to member function

  • Context:
  • Thread starter Thread starter ORF
  • Start date Start date
  • Tags Tags
    Function Member
Join the discussion
Ask a follow-up here, or get your own question answered by working scientists, mathematicians and engineers — people, not an autocomplete.
Real named experts · corrections over time · the nuance an AI answer skips
2 replies · 2K views
ORF
Messages
169
Reaction score
19
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
 
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]
 
Reply
  • Like
Likes   Reactions: ORF and jim mcnamara