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

Unresolved External Symbol. MSVS community 2015

本文关键字:MSVS 社区 2015 符号 外部      更新时间:2023-10-16

在编译我的程序时,我得到一个链接错误LINK2019。常见的错误是声明了函数但没有定义,这里不是这种情况。例如,下面的类是在头文件dict.h

中定义的
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放在源文件目录/

中。

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