2012-10-15 26 views
5

Tôi đang cố gắng sử dụng một lớp mẫu và khi tôi biên dịch nó trong một tập tin trong LWS nó hoạt động: http://liveworkspace.org/code/a9c412a7e683439dfa35a9363749369dTemplate build lỗi: những biểu tượng Không xác định cho kiến ​​trúc x86_64:

Nhưng khi tôi cố gắng để biên dịch nó làm-up của 3 tác phẩm,

dòng stack.h 4-21

dòng stack.cpp 24-48

dòng main.cpp 49 để kết thúc

Khi tôi cố gắng biên dịch những 3 file tôi nhận được

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 

Có, tôi đã bao gồm stack.h trong một stack.cpp và main.cpp file

+1

cơ quan chức năng Mẫu của bạn cần phải TẤT CẢ được trong các tập tin tiêu đề của bạn. Nếu bạn cắt những dòng này bằng cách sử dụng các dòng bạn đã đề cập, bạn có các khuôn mẫu <> trong các tệp .cpp, chúng phải có sẵn để trình biên dịch thực hiện khấu trừ, và do đó phải nằm trong tệp tiêu đề. – WhozCraig

+0

vì vậy tôi nên chèn dòng nào vào tệp tiêu đề? –

+1

Đánh giá bằng mã của bạn, bạn thậm chí không nên * cần * một tệp stack.cpp, nếu điều đó có ích. Di chuyển tất cả triển khai mẫu Stack vào tiêu đề của bạn. – WhozCraig

Trả lời

7

Âm thanh như bạn cần phải đặt các định nghĩa mẫu của ngăn xếp lại trong tệp tiêu đề. Các mẫu tạo ra một kế hoạch để tạo mã, do đó nếu trình biên dịch không thể nhìn thấy toàn bộ định nghĩa mẫu và chỉ nhìn thấy khai báo, mã cho bản mẫu cụ thể đó của mẫu sẽ không được tạo ra. Nó sẽ chỉ đơn giản là tin tưởng vào việc khai báo và mong đợi rằng tại thời điểm liên kết tồn tại một tệp đối tượng với các phần của các mẫu đó. Giải pháp cho điều này là 1) giữ các định nghĩa mẫu trong tệp tiêu đề hoặc 2) tạo trước các định nghĩa được yêu cầu để trình liên kết có thể tìm thấy chúng tại thời gian liên kết.

Xem ở đây: Template issue causes linker error (C++)

Các vấn đề liên quan