C++ 未解析的外部符号。MSV社区2015

C++ 未解析的外部符号。MSV社区2015,c++,visual-studio,linker-errors,C++,Visual Studio,Linker Errors,在编译我的程序时,我得到一个链接错误LINK2019。常见的错误是声明了一个函数,但没有定义,这里的情况并非如此。 例如,我有下面在头文件dict.h中定义的类 template<typename key, typename elem> class Slist{ public: list<KV_pair<key, elem>> *data; Slist(int size); ~Slist(); void insert(KV_

在编译我的程序时,我得到一个链接错误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);
};
模板
班级名单{
公众:
列表*数据;
Slist(int-size);
~Slist();
空心插入件(KV_对和KV);
电气和操作员[](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);
    }
}
模板
Slist::Slist(整型大小){
数据=新列表(大小);
}
样板
Slist::~Slist(){
}
样板
空心滑轨::插入件(KV\u对和KV){
KV_对*温度;
对于(数据->移动开始();数据->规则()>0;数据->下一步()){
temp=&data->get_val();
如果(临时->获取密钥()>千伏获取密钥()){
打破
}
数据->插入(千伏);
}
}

如果我把
main()
放在dict.cpp文件中,一切正常,但是当我试图把
main()
放在一个单独的文件中,并且
#包括“dict.h”
时,我会得到未解决的外部错误。尽管这样做是不正确的,但在
包含“dict.h”
之后使用
包含“dict.cpp”
可以解决此错误。我将dict.h文件放在头文件目录中,并将main.cpp和dict.cpp都放在源文件目录中/

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

模板案例中的类声明和防御必须存在于单个文件中。很好,当这不起作用时,我有点崩溃。C++无疑是一个微妙的陷阱,所以在链接中最好的解决方案提供了一个.tpp文件的建议,并在头的末尾包含它。我应该把.tpp文件放在哪个目录下?@Mykola:不一定,看看Ben在评论中链接的问题。模板可以在.cpp文件中显式实例化。