My question is that, I have a template class template<class T> AList as base, and I wanna get a derived class from the template, i.e. get class BList: public AList<mydefinedtype> without much modification.
alist.h
#ifndef alist_h
#define alist_h
template<class T> class AList
{
public:
    AList(){
        arr = new T[20];
        numitems = 0;
    };
    void append(T value);
       
private:
    T *arr;
    int numitems;
};
#endif /* alist_h */
alist.cpp
#include "alist.h"
template<class T> void AList<T>::append(T value)
{
    arr[numitems] = value;
    ++numitems;
    return;
}
blist.h
#include "alist.cpp"
#include <string>
using namespace std;
typedef struct 
{
    string a, b;
    int key;
} record;
class BList: public AList<record>{
    public:
        void test(void){
            cout << "this is from BList" << endl;
        }
};
blist.cpp
#include "blist.h"
main.cpp
#include <iostream>
#include "blist.cpp"
using namespace std;
int main(){
    record testRecord[3];
    testRecord[0] = {"Mark", "A", 1};
    testRecord[1] = {"Anla", "B", 2};
    testRecord[2] = {"Cindy", "C", 3};
    BList blist = BList();
    for(auto i: testRecord){
        // blist.append(i); // will compile error
        blist.test();
    } 
    return 0;
}
It will fail as follows, I wonder how to compile or how to fix the bug. error info
Undefined symbols for architecture x86_64:
  "AList<record>::append(s)", referenced from:
      _main in main.o
ld: symbol(s) not found for architecture x86_64
Not sure where comes from the issue.
 
     
    