30/09/2018, 17:05

LNK2019 :: Linker Error LNK2019 khi sử dụng template

Mình có làm một chương trình đơn giản sử dụng template như sau.

demo.h

#pragma once

#define normalize template <class T>
#include <iostream>
using namespace std;

normalize struct Stack_Array
{
    T *s;        // dùng mảng động quản lý tốt bộ nhớ hơn    
    int nItem;    // số lượng phần tử có trong ngăn xếp
};
// hàm khởi tạo ngăn xếp rỗng
normalize void Init(Stack_Array<T>& stack);

demo.cpp


#include "demo.h"

// hàm khởi tạo ngăn xếp rỗng
normalize void Init(Stack_Array<T>& stack)
{
    stack.nItem = 0;
    stack.s = NULL;
}

main.cpp

#include <iostream>
#include "demo.h"

using namespace std;

int main()
{
    Stack_Array<int> stack;

    Init(stack);

    cin.get();
    return 0;
}

Nhưng khi build thì lại bị lỗi này

Error 1 error LNK2019: unresolved external symbol “void __cdecl Init(struct Stack_Array &)” (??$Init@H@@YAXAAU?$Stack_Array@H@@@Z) referenced in function _main

Bổ sung
Khi để tất cả vào một file main.cpp thì build bình thường không có lỗi nào khác

Mai Anh Dũng viết 19:11 ngày 30/09/2018

Bạn không thể implement template ở file .cpp được. Bạn phải mang nó vào file .h. Đây là một yêu cầu khá đặc biệt dành cho template.

Bạn đem cái define của hàm Init sang file demo.h là ổn.

#pragma once

#define normalize template <class T>
#include <iostream>
using namespace std;

normalize struct Stack_Array
{
    T *s;        // dùng mảng động quản lý tốt bộ nhớ hơn
    int nItem;    // số lượng phần tử có trong ngăn xếp
};
// hàm khởi tạo ngăn xếp rỗng
// normalize void Init(Stack_Array<T>& stack);

// hàm khởi tạo ngăn xếp rỗng
normalize void Init(Stack_Array<T>& stack)
{
    stack.nItem = 0;
    stack.s = NULL;
}
Evil viết 19:16 ngày 30/09/2018

Cám ơn anh @ltd. Em hiểu rồi. Loay hoay với mấy cái linker này hoài

Bài liên quan
0