未解析的外部符号。 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.
中的文件
编译我的程序时,出现 link 错误 LINK2019。常见的错误是函数已声明但未定义,但这里不是这种情况。 例如,我在头文件 dict.h
中定义了下面的 classtemplate<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.
中的文件