ďťż

Ładny brzuch

Programuję w C++ od niedawna. Jako kompilatora używam Visual C++ 2008 Express Edition.
Natrafiłem na następujący problem z którym nie mogę sobie poradzić:

Chcę np. zadeklarować szablon funkcji TYP funkcja(TYP zmienna) rozbijając ją na predefinicję i definicję.
Z tego co wiem należy to zrobić tak:

template <typename TYP> TYP funkcja(TYP zmienna) //predefinicja template <typename TYP> TYP funkcja<TYP>(TYP zmienna) //definicja { //kod funkcji }
kod ten działa bez zarzutu do póki obie jego części znajdują się w jednym pliku. Jeżeli rozbiję go na plik główny i nagłówkowy kompilator zgłasza następujący błąd:
error LNK2028: unresolved token (0A00000B) "int __cdecl funkcja<int>(int)" (??$funkcja@H@@$$FYAHH@Z) referenced in function "int __clrcall main(cli::array<class System::String ^ >^)" (?main@@$$HYMHP$01AP$AAVString@System@@@Z)

Wygląda to tak jakbym robił jakiś błąd przy dołączaniu plików do projektu, tylko że umieszczone w tych samych plikach zwykłe funkcje (także rozbite na pliki nagłówkowe i kod) działają bez zarzutu.

Jeżeli ktoś jest w stanie to wyjaśnić, bardzo proszę o pomoc i z góry dziękuję.



Predefinicji nie kończymy średnikiem??


Predefinicji nie kończymy średnikiem??
Owszem. Mój błąd. Kod powinien wyglądać tak:

template <typename TYP> TYP funkcja(TYP zmienna); //predefinicja template <typename TYP> TYP funkcja<TYP>(TYP zmienna) //definicja { //kod funkcji }
Nie rozwiązuje to jednak problemu - w kodzie programu średnik był cały czas. Błąd zrobiłem dopiero pisząc to tutaj.

1 Sprawa:

Jeżeli kompilator przepuszcza Ci coś takiego:

template <typename TYP> TYP funkcja(TYP zmienna); template <typename TYP> TYP funkcja<TYP>(TYP zmienna) { }

Natychmiast go zmień. Taki kod jest niepoprawny. W definicji nie występują nawiasy ostre po nazwie funkcji szablonowej. (Chyba, że jest to tzw. specjalizacja funkcji szablonowej).

2 Sprawa:

Jeżeli robisz to tak, że w pliku nagłówkowym jest deklaracja, a w pliku np. szablony.cpp definicja, to nie dziwne, że podczas wywołania funkcji szablonowej z jeszcze innego pliku następuje błąd. Poczytaj o modelu włączania (inclusion model), konkretyzacji jawnej (explicit instantiation directive) oraz o modelu separacji (choć on jeszcze nie jest w pełni obsługiwany przez wszystkie kompilatory).

Wszystkie te 3 rzeczy znajdziesz w tym oto PDFie:

-----> http://www.gamedev.p...utorial/2_4.pdf
Użytkownik Quentin edytował ten post 04 wrzesień 2009, 16:17


Serdecznie dzięki za pomoc. To rozwiązuje problem.

Przy kompilatorze jak na razie chyba pozostanę mimo, że nie obsługuje słówka export... mam nadzieje, że jeszcze zostanie to naprawione.


nie obsługuje słówka export... mam nadzieje, że jeszcze zostanie to naprawione.

To zostanie dodane w C++0x, choć niektóre kompilatory już teraz to obsługują :)


To zostanie dodane w C++0x, choć niektóre kompilatory już teraz to obsługują :)
Z tego co wiem obsługuje je już Microsoft Visual C++ 2003, ale jak się wczoraj przekonałem Microsoft Visual C++ 2008 Express Edition już nie. /o\

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •