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

0

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

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:

#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;
}
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.

0

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

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:

void (A<T>::*f)()
0

a chciałem uniknąć tego monstrum :(

4

Rozwiązanie jest dość proste:

#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;
}
0

winerfresh, dzięki :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0