Uniwersalny kontener function
Ostatnio zmodyfikowano 2014-03-02 17:46
Haker123 Temat założony przez niniejszego użytkownika |
Uniwersalny kontener function » 2014-03-02 00:52:07 Witam. Mam klase która przechowuje i wypisuje funkcje za pomoca "function" Jak można zrobić żeby "function" mogło przechowywać róznego rodzaju funkcje, tak żeby w jednym menu przyjmowała same funkcje void() a innym raze bool() lub inne? Jak narazie to starałem się to zrobić za pomocą szablonów ale dostaje same błędy i to w bibliotece function. d:\programy\microsoft visual c++ 2010 express\vc\include\functional(94): error C2027: use of undefined type 'std::tr1::_Get_function_impl<_Tx>' 1> with 1> [ 1> _Tx=bool 1> ] 1> d:\programy\microsoft visual c++ 2010 express\vc\include\moje\menu.h(23) : see reference to class template instantiation 'std::tr1::function<_Fty>' being compiled 1> with 1> [ 1> _Fty=bool 1> ] 1> d:\programy\microsoft visual c++ 2010 express\vc\include\moje\menu.h(24) : see reference to class template instantiation 'cMenu<Typ>::sDane' being compiled 1> with 1> [ 1> Typ=bool 1> ] 1> d:\programowanie\projekty - programy\moje\mix\mix\main.cpp(33) : see reference to class template instantiation 'cMenu<Typ>' being compiled 1> with 1> [ 1> Typ=bool 1> ] 1>d:\programy\microsoft visual c++ 2010 express\vc\include\functional(95): error C2504: '_Type' : base class undefined 1>d:\programy\microsoft visual c++ 2010 express\vc\include\functional(98): error C2027: use of undefined type 'std::tr1::_Get_function_impl<_Tx>' 1> with 1> [ 1> _Tx=bool 1> ] 1>d:\programy\microsoft visual c++ 2010 express\vc\include\functional(98): error C2146: syntax error : missing ';' before identifier '_Mybase' 1>d:\programy\microsoft visual c++ 2010 express\vc\include\functional(98): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 1>d:\programy\microsoft visual c++ 2010 express\vc\include\functional(98): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 1>d:\programy\microsoft visual c++ 2010 express\vc\include\functional(94): error C2027: use of undefined type 'std::tr1::_Get_function_impl<_Tx>' 1> with 1> [ 1> _Tx=void 1> ] 1> d:\programy\microsoft visual c++ 2010 express\vc\include\moje\menu.h(23) : see reference to class template instantiation 'std::tr1::function<_Fty>' being compiled 1> with 1> [ 1> _Fty=void 1> ] 1> d:\programy\microsoft visual c++ 2010 express\vc\include\moje\menu.h(24) : see reference to class template instantiation 'cMenu<Typ>::sDane' being compiled 1> with 1> [ 1> Typ=void 1> ] 1> d:\programowanie\projekty - programy\moje\mix\mix\main.cpp(62) : see reference to class template instantiation 'cMenu<Typ>' being compiled 1> with 1> [ 1> Typ=void 1> ] 1>d:\programy\microsoft visual c++ 2010 express\vc\include\functional(95): error C2504: '_Type' : base class undefined 1>d:\programy\microsoft visual c++ 2010 express\vc\include\functional(98): error C2027: use of undefined type 'std::tr1::_Get_function_impl<_Tx>' 1> with 1> [ 1> _Tx=void 1> ] 1>d:\programy\microsoft visual c++ 2010 express\vc\include\functional(98): error C2146: syntax error : missing ';' before identifier '_Mybase' 1>d:\programy\microsoft visual c++ 2010 express\vc\include\functional(98): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 1>d:\programy\microsoft visual c++ 2010 express\vc\include\functional(98): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
template < class Typ > class cMenu { public: struct sDane { string Nazwa; function < Typ > funkcja; } Dane; bool wypisz(); void Dodaj() { vecWypis.push_back( Dane ); } cMenu() : pozycja( 0 ) , prawda( true ) { }; private: int pozycja; bool prawda; vector < sDane > vecWypis; }; Tak używam. int main() { cMenu < void > Menu0; Menu0.Dane.Nazwa = "EXIT"; Menu0.Dodaj(); Menu0.Dane.Nazwa = "KOLKO I KRZYZYK"; Menu0.Dane.funkcja = Gra; Menu0.Dodaj(); Menu0.Dane.Nazwa = "LABIRYNT"; Menu0.Dane.funkcja = Lab; Menu0.Dodaj(); while( Menu0.wypisz() ) { } return 0; } Funkcje "Gra" oraz "Lab" zwracają void i nie mają posiadają argumentów. Funkcja "wypisz()" ma za zadanie wypisać menu i po wciśnięciu entera uruchomić odpowiednią funkcje. |
|
Monika90 |
» 2014-03-02 09:16:00 |
|
Haker123 Temat założony przez niniejszego użytkownika |
» 2014-03-02 15:20:56 Korzystam z "Microsoft Visual C++ 2010 Express". Czyli te błędy są spowodowane przestarzałym kompilatorem??
P.S Mogłbys mi podac jakis link do podobnej funkcji jak "functin" w c++11, bo tego nowego standardu narazie w ogóle nie znam jeszcze. |
|
Monika90 |
» 2014-03-02 16:05:04 Czyli te błędy są spowodowane przestarzałym kompilatorem?? |
Nie. Te błędy są spowodowane tym, że jako argument szablonu cMenu podałeś void i bool zamiast void() i bool(). Ale w komentarzu masz napisane wpisywalem rozniez <void(void)> oraz <void()> |
Jeżeli to wpisywałeś, to nie powinno być błędu. Czy kod do którego link podałam wyżej, kompiluje się twoim kompilatorem (jeżeli nie to może trzeba dopisać using namespace std::tr1;). link do podobnej funkcji jak "functin" w c++11 |
Alternatywą dla std::function jest boost::function http://www.boost.org/doc/libs/1_55_0/doc/html/function.htmlAle nie powinno to być potrzebne bo MSVC++ 2010 ma function. Nie wiem czy w przestrzeni nazw std czy w std::tr1, ale ma na pewno. |
|
Haker123 Temat założony przez niniejszego użytkownika |
» 2014-03-02 17:46:26 Nic już z tego nie rozumiem. Teraz wszystko działa jak trzeba (poza licznymi ostrzezeniami do getch i kbhit).
Już któryś raz zdarza się że kompilator robi mi takie chece że kod raz działa a raz nie ;/ Chyba musze pomyśleć o nowszej wersji, może tam nie bede mial takich problemów.
Dzięki za pomoc ;] |
|
« 1 » |