01/10/2018, 10:01

Lỗi C++ undefined reference to khi nhạp hàm từ file header

Mình đang tạo ra stack với header và class 2 file riêng biệt. Nhưng lúc mình chạy thì lại báo lỗi thế này . Mình đã thử google nhưng không cách nào được. Các bạn xem giúp mình

Compiling: g++ Instructor_prog2_3.cpp Tokenizer.cpp Stack.cpp -o proginstructor_2_3
/tmp/ccDEp56i.o: In function `main':
Instructor_prog2_3.cpp:(.text+0x68): undefined reference to `Stack::Stack()'
Instructor_prog2_3.cpp:(.text+0x89): undefined reference to `Stack::Push(int)'
Instructor_prog2_3.cpp:(.text+0x9b): undefined reference to `Stack::Print()'
Instructor_prog2_3.cpp:(.text+0xdc): undefined reference to `Stack::Pop()'
Instructor_prog2_3.cpp:(.text+0x116): undefined reference to `Stack::Print()'
collect2: error: ld returned 1 exit status
Compile Fail
#ifndef Stack_h
#define Stack_h
#include <iostream>
#include <vector>

using namespace std;

template <class T> 
class Stack
{
    private:
        vector<T> elements;

    public:
        Stack<T>();
        void Push(T value);
        T Pop();
        void Print();
};

#endif


#include <iostream>
#include <cstdlib>
#include <string>
#include <stdexcept>
#include "Stack.hpp"

using namespace std;

template <class T> 
void Stack<T>::Push(T value){
    this->elements.push_back(value);
}

template <class T> 
T Stack<T>::Pop(){
    if (this->elements.empty()){
        throw out_of_range("Stack Empty!");
    }
    return this->elements.pop_back();
}

template <class T> 
void Stack<T>::Print(){
    if (this->elements.empty()){
        throw out_of_range("Stack Empty!");
    }else{
        cout << "[ " ;
        for (int i=0; i < this->elements.size(); i++){
            cout << this->elements[i] ;        
        }
        cout << " ]" ;
    }
}


HK boy viết 12:17 ngày 01/10/2018

Thư viện stack của bạn là Stack_h chứ nhỉ?
Mà sao bạn dùng std::vector mà không dùng std::stack?

Gió viết 12:12 ngày 01/10/2018

Với kiểu dữ liệu là template trình biên dịch chưa thể xác định T có kiểu dữ liệu gì để biên dịch trước file này. Tốt nhất là nhét vào file header, khi nào dịch chương trình thì nó sẽ hiểu T là gì và biên dịch class Stack<T> , hoặc nếu bạn tách file riêng ra thì phải có kiểu cho T để biên dịch trước

Ví dụ trong chương trình sử dụng Stack<int> thì file .cpp sẽ có:

... // implement function Stack<T> ...
class Stack<int>;  // khai báo để biên dịch trước 

Nói chung là nên nhét template vào 1 file header thôi, mình thấy thư viện std họ cũng làm như vậy cả

Trần Hoàn viết 12:08 ngày 01/10/2018

Chắc đang bị giáo viên yêu cầu xây dựng mô phỏng stack chứ nếu tự học thì ai lại đi phát minh lại cái bánh xe thế

David Teo viết 12:02 ngày 01/10/2018

Hình như hồi năm 2 mình có nghe thầy nói 1 câu như vậy không biết đúng không. “Khi sử dụng template thì không được tách ra làm 2 file là .h và .cpp mà để chung 1 file”

Bài liên quan
0