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

Odpowiedz Nowy wątek
2011-08-29 21:22
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;
}

░█░█░█░█░█░█░█░█░█░█░█░

Pozostało 580 znaków

2011-08-29 21:31
uhu
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.

Pozostało 580 znaków

2011-08-29 21:34
0

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


░█░█░█░█░█░█░█░█░█░█░█░
edytowany 2x, ostatnio: krwq, 2011-08-29 21:35

Pozostało 580 znaków

2011-08-29 22:07
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)()

Pozostało 580 znaków

2011-08-29 22:10
0

a chciałem uniknąć tego monstrum :(


░█░█░█░█░█░█░█░█░█░█░█░
edytowany 1x, ostatnio: krwq, 2011-08-29 22:10

Pozostało 580 znaków

2011-08-29 22:17

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

Pozostało 580 znaków

2011-08-29 22:19
0

winerfresh, dzięki :)


░█░█░█░█░█░█░█░█░█░█░█░
ja jeszcze od siebie dorzucę ciekawy link do stronki, która wyjaśnia nieszczęsny typename, może się komuś przyda. Sam ostatnio rozkminiałem przez pół dnia, bo kompilator rzucała przedziwne błędy. http://lmmilewski.blogspot.com/2008/11/od-czego-jest-typename-w-c.html - oczekp 2011-08-29 23:53

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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