2012-10-15 23 views
5

Próbuję użyć klasy szablonu i kiedy go skompilować w jednym pliku w LWS to działa: http://liveworkspace.org/code/a9c412a7e683439dfa35a9363749369dSzablon build błąd: niezdefiniowane symbole dla architektury x86_64:

Ale gdy próbuję skompilować to wymyślona 3 plików

linii stack.h 4 do 21

linii stack.cpp 24 do 48

linii main.cpp 49 do końca

Kiedy próbuję skompilować te 3 pliki dostaję

Undefined symbols for architecture x86_64: 
    "Stack2<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::push(Node**, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)", referenced from: 
     _main in ccCoizCT.o 
    "Stack2<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::top(Node*&)", referenced from: 
     _main in ccCoizCT.o 
    "Stack2<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::pop(Node*&)", referenced from: 
     _main in ccCoizCT.o 
ld: symbol(s) not found for architecture x86_64 
collect2: ld returned 1 exit status 

Tak mam włączone stack.h w ciągu stack.cpp i main.cpp plików

+1

Wasze ciała funkcji szablonu muszą być w całości w plikach nagłówkowych. Jeśli przycinałeś je używając wspomnianych linii, masz szablony <> ciał w plikach .cpp, muszą one być dostępne dla kompilatora do wykonania dedukcji, a zatem muszą być w pliku nagłówkowym. – WhozCraig

+0

, które linie należy wstawić do pliku nagłówkowego? –

+1

Sądząc po kodzie, nie powinieneś * potrzebować * pliku stack.cpp, jeśli to pomaga. Przenieś wszystkie implementacje szablonów stosu do swojego nagłówka. – WhozCraig

Odpowiedz

7

brzmi jak trzeba umieścić definicje szablonów z powrócić do pliku nagłówkowego. Szablony tworzą plan generowania kodu, więc jeśli kompilator nie widzi całej definicji szablonu i widzi tylko deklarację, kod dla tej konkretnej chwili szablonu nie zostanie wygenerowany. Będzie po prostu ufać deklaracji i oczekiwać, że w czasie łączenia istnieje plik obiektów z tymi szablonami. Rozwiązaniem tego problemu jest 1) zachowanie definicji szablonów w pliku nagłówkowym lub 2) tworzenie wstępnie wymaganych definicji, aby linker mógł je znaleźć w czasie połączenia.

Zobacz tutaj: Template issue causes linker error (C++)

Powiązane problemy