Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Problem z template: "fatal error LNK1120: 1 unresolved externals".

Ostatnio zmodyfikowano 2015-08-20 23:20
Autor Wiadomość
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:
C/C++
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>

using namespace std;

class Loader
{
public:
    bool adres( fstream & ); // - ustawia wewnętrzny wskaźnik na plik
    void syntax( string, string, string ); // - ustawia składnię
   
    void dodaj( string, string ); // - 1 argument - nazwa nowej wartości, 2 argument - wartość która ma być przypisana
   
    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.
P-136615
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.
P-136616
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?
P-136617
pekfos
» 2015-08-20 23:09:12
a definicja metod w .cpp.
Szablon musi być zdefiniowany w nagłówku.
P-136618
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ć.
P-136620
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 ;)
P-136621
« 1 »
  Strona 1 z 1