Wskaźnik na funkcję składową w szablonie

Wskaźnik na funkcję składową w szablonie
KR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2520
0

Dlaczego ten kod w takiej formie działa, a po odkomentowaniu pokazuje błąd:

Kopiuj
16: variable or field 'c' declared void
16: expected ')' before 'f'
In function 'int main()':
26: 'c' was not declared in this scope
26: expected primary-expression before 'int'
26: expected ';' before 'int'
=== Build finished: 5 errors, 0 warnings ===

kod:

Kopiuj
#include <stdio.h>

template<class T>
class A
{
public:
  typedef void (A<T>::*Func)();
  void d()
    {
      printf("Udalo sie!");
    }
};

/*
template<class T>
void c(A<T>::Func f)
{
  A<T> test;
  (test.*f)();
}/**/


int main()
{
  A<int>::Func d = &A<int>::d;
  //c<int>(&A<int>::d);
  return 0;
}
  • Rejestracja: dni
  • Ostatnio: dni
0

ty chcesz zrobić wskaźnik na metodę, a nie zwykłą funkcję. Metoda musi być powiązana z obiektem. Poczytaj o wskaźnikach na metody, było na 4p.

KR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2520
0

przecież jest powiązana w tym kodzie, poza tym z klasą a nie z obiektem

byku_guzio
  • Rejestracja: dni
  • Ostatnio: dni
0

W sumie nie wiem czemu się tak dzieje. Może typedef nie radzi sobie z szablonami. Chyba nie ma wyjścia tylko argument funkcji musi wyglądać w tym wypadku tak:

Kopiuj
void (A<T>::*f)()
KR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2520
0

a chciałem uniknąć tego monstrum :(

hauleth
  • Rejestracja: dni
  • Ostatnio: dni
4

Rozwiązanie jest dość proste:

Kopiuj
#include <stdio.h>
 
template<class T>
class A
{
public:
  typedef void (A<T>::*Func)();
  void d()
    {
      printf("Udalo sie!");
    }
};
 
template<class T>
void c(typename A<T>::Func f)
{
  typename A<T> test;
  (test.*f)();
}
 
 
int main()
{
  A<int>::Func d = &A<int>::d;
  c<int>(&A<int>::d);
  return 0;
}
KR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2520
0

winerfresh, dzięki :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.