Problem z template: "fatal error LNK1120: 1 unresolved externals".
Ostatnio zmodyfikowano 2015-08-20 23:20
nano-stalker Temat założony przez niniejszego użytkownika |
Problem z template: "fatal error LNK1120: 1 unresolved externals". » 2015-08-20 23:00:22 Witam. Otóż nie mogę sobie poradzić z pewnym błędem kompilacji: MAIN.obj : error LNK2019: unresolved external symbol "public: void __thiscall ml::Loader::newValue<int>(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,int const &)" (??$newValue@H@Loader@ml@@QAEXV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@ABH@Z) referenced in function _main C:\Documents and Settings\ADMIN\Moje dokumenty\Visual Studio 2010\Projects\MicroLib\Debug\MicroLib.exe : fatal error LNK1120: 1 unresolved externals Zauważyłem, że taki błąd wyskakiwał czasem, gdy jakaś metoda z klasy nie była zdefiniowana. Lecz w tym wypadku wszystko jest w porządku. Oto przykładowy kod dosłownie przepisany (działający) z tej klasy i "włożony" do "mniejszej wersji" tzn. skróconej na to forum: #include <iostream> #include <fstream> #include <string> #include <sstream>
using namespace std;
class Loader { public: bool adres( fstream & ); void syntax( string, string, string ); void dodaj( string, string ); template < typename X > void newValue( string, const X & ); fstream * file; string center, starter, breaker; };
bool Loader::adres( fstream & file ) { if( file.is_open() ) { this->file = & file; return true; } else return false; } void Loader::syntax( string center, string starter, string breaker ) { this->center = center; this->starter = starter; this->breaker = breaker; }
void Loader::dodaj( string valueName, string value ) { file->seekg( 0, ios::end ); * file << "\n" << valueName << center << starter << value << breaker; } template < typename X > void Loader::newValue( string valueName, const X & value ) { std::ostringstream ss; ss << 1; dodaj( valueName, ss.str() ); }
int main() { fstream file; file.open( "C:/Ja.info" ); cout << "Starting\n"; Loader load; load.syntax( "=", "<", ">" ); load.adres( file ); load.newValue( "imie", 12 ); system( "pause" ); }
No i właśnie o to chodzi, że ten oto powyższy kod, dosłownie skopiowany z innego projektu w innym projekcie działa a w oryginalnym nie chce i wyrzuca błąd podany powyżej. Wiem że to co podałem nie pomoże w pomocy mi :) ale ja tego błędu nie rozumiem, a całego kodu kopiował nie będę bo nikomu grzebać się w nim nie będzie chciało. Wie ktoś na czym może polegać mój problem? Z góry bardzo dziękuję za pomoc. PS. Aha zapomniałem dodać, że to się "stało" gdy zacząłem się bawić template. I jeszcze jedno, to co podałem zapisane jest w jednym pliku .cpp a w oryginalnym projekcie deklaracja klasy zapisana była w pliku nagłówkowym, a definicja metod w .cpp. Dzięki. |
|
michal11 |
» 2015-08-20 23:03:06 A nie jest to może funkcja wirtualna ?
Nie definiuje się funkcji szablonowych w pliku .cpp tylko w pliku .h.
|
|
nano-stalker Temat założony przez niniejszego użytkownika |
» 2015-08-20 23:06:53 To znaczy że definicję mam tak poprostu "wrzucić" pliku .h? |
|
pekfos |
» 2015-08-20 23:09:12 a definicja metod w .cpp. |
Szablon musi być zdefiniowany w nagłówku. |
|
michal11 |
» 2015-08-20 23:19:27 To znaczy że definicję mam tak poprostu "wrzucić" pliku .h? |
Tak, jeżeli przekleisz pod deklarację klasy to powinno bez żadnych zmian działać. |
|
nano-stalker Temat założony przez niniejszego użytkownika |
» 2015-08-20 23:20:21 O tak, dziękuję. To jest takie dość "brzydkie" rozwiązanie umieszczać w pliku nagłówkowym ale trudno. @edit michal11 też dobre :) dzięki za pomysł ;). Zamykam temat, rozwiązanie: Szablony definiujemy w pliku nagłówkkowym (.h .hpp) tzn. cała deklaracja i definicja metody, która zawiera template musi znajdować się w pliku nagłówkowym, czyli nie możemy przenieść jej do pliku .cpp z definicjami metod. Dziękuję bardzo za pomoc ;) |
|
« 1 » |