未解析的外部符号。 MSVS 社区 2015

Unresolved External Symbol. MSVS community 2015

编译我的程序时,出现 link 错误 LINK2019。常见的错误是函数已声明但未定义,但这里不是这种情况。 例如,我在头文件 dict.h

中定义了下面的 class
template<typename key, typename elem>
class Slist{
public:
    list<KV_pair<key, elem>> *data;

    Slist(int size);
    ~Slist();

    void insert(KV_pair<key, elem> &kv);
    elem &operator[](key k_val);
};

而且我在单独的 dict.cpp 文件中定义了成员

template<typename key, typename elem>
Slist<key, elem>::Slist(int size) {
    data = new list<KV_pair<key, elem>>(size);
}

template<typename key, typename elem>
Slist<key, elem>::~Slist() {


}

template<typename key, typename elem>
void Slist<key, elem>::insert(KV_pair<key, elem> &kv){
    KV_pair<key, elem> *temp;
    for (data->movestart();data->r_len() > 0; data->next()) {
        temp = &data->get_val();
        if (temp->get_key() > kv.get_key()) {
            break;
        }
        data->insert(kv);
    }
}

如果我将 main() 放在 dict.cpp 文件中,一切正常,但是当我尝试将 main() 放在一个单独的文件中并且 #include "dict.h" 我得到未解决的外部错误。虽然这样做是不正确的,但在 #include "dict.h" 之后使用 #include "dict.cpp" 可以解决错误。我在头文件目录中有 dict.h 文件,并将 main.cpp 和 dict.cpp 都放在源文件目录/

编译器在使用时扩展模板化类型(和函数)。这意味着编译器必须能够 找到 它们在使用时的定义。因此,所有模板定义(不仅仅是声明)必须存在于 header 中,或者包含在 header.

中的文件