Du hast den Fehler ja schon erkannt. Bei Templates muss sowohl Deklaration als auch Definition für die selbe Compiliereinheit sichtbar sein. D.h. du hast drei Möglichkeiten:
Du schreibst Deklaration und Definition in den Header
Du deklarierst das Template im Header und includierst direkt darunter die Datei mit der Template Definition
Du verwendest
export um das Template zu exportieren.
Zu drittem Ansatz ist zu sagen das es bis heute kaum Compiler gibt die dieses C++ Feature unterstützen, also ist das meist hinfällig (für VS6 Benutzer sowiso). Bleiben also zwei Möglichkeiten.
Bei dir kommt noch hinzu das du den Code in die Dll exportieren willst. Wie du aber bereits erkannt hast funktioniert das nicht, da Templates zur kompilierzeit neuen Code erzeugen und du keinen Template Code in Dlls ablegen kannst.
Was du also tun kannst ist einfach alle Templates vollständig im Header zu implementieren und mit deinen Bibliotheksheader mitzuliefern.