LNK2019 在一些 class 函数上,但在其他函数上没有(dll 中的模板 class)
LNK2019 on some class functions, but not on others (template class in dll)
好的,不包括整个代码库...
#ifdef KIT_EXPORTS
#define KIT_API __declspec(dllexport)
#define EXP_TEMPLATE
#else
#define KIT_API __declspec(dllimport)
#define EXP_TEMPLATE extern
#endif
#ifndef KIT_LINKED_LIST_H
#define KIT_LINKED_LIST_H
#includes ...
namespace Kit
{
template <class tmplt>
class KIT_API KitLinkedList
{
private:
...
public:
KitLinkedList()
{
...
}
KitLinkedList(tmplt obj)
{
...
}
KitLinkedList(const KitLinkedList& other)
{
...
}
~KitLinkedList()
{
...
}
void PushBack(tmplt obj)
{
KitLinkedListNode<tmplt>* addedNode = new KitLinkedListNode<tmplt>(obj);
tail->nextNode = addedNode;
tail = addedNode;
count++;
}
uint64_t Count()
{
return count;
}
KitLinkedListIterator<tmplt> GetIterator()
{
return KitLinkedListIterator<tmplt>(root->nextNode);
}
... some other happy functions live here
};
}
我的非dll代码:
KitLinkedList<KitString> savedGameList = saveSet.ListSavedGames();
savedGameList.PushBack(KitString("blah"));
if (savedGameList.Count() > 0)
{
}
- 我有一个链接列表模板 class 完全在 .h 文件中的 dll 中声明和定义。
- 我在dll之外成功使用模板class,编译,链接,和运行
- 使用 class 中的某些函数会导致链接器错误。
savedGameList.Count() 导致 LNK2019,但 pushback() 和 getiterator() 不会。
好的,这让我开始构建,但我不知道它为什么有效:
将函数声明为:
template <class tmplt>
uint64_t Count()
{
return count;
}
并这样称呼它:
if (savedGameList.Count<KitString>() > 0)
显然编译器看不到该函数,因为它没有携带模板化类型(即使它在 class 声明的范围内)
正确答案是模板 class 不依赖于 dll,因为它需要的一切都在 header 中。所以 KIT_API 应该被删除。
好的,不包括整个代码库...
#ifdef KIT_EXPORTS
#define KIT_API __declspec(dllexport)
#define EXP_TEMPLATE
#else
#define KIT_API __declspec(dllimport)
#define EXP_TEMPLATE extern
#endif
#ifndef KIT_LINKED_LIST_H
#define KIT_LINKED_LIST_H
#includes ...
namespace Kit
{
template <class tmplt>
class KIT_API KitLinkedList
{
private:
...
public:
KitLinkedList()
{
...
}
KitLinkedList(tmplt obj)
{
...
}
KitLinkedList(const KitLinkedList& other)
{
...
}
~KitLinkedList()
{
...
}
void PushBack(tmplt obj)
{
KitLinkedListNode<tmplt>* addedNode = new KitLinkedListNode<tmplt>(obj);
tail->nextNode = addedNode;
tail = addedNode;
count++;
}
uint64_t Count()
{
return count;
}
KitLinkedListIterator<tmplt> GetIterator()
{
return KitLinkedListIterator<tmplt>(root->nextNode);
}
... some other happy functions live here
};
}
我的非dll代码:
KitLinkedList<KitString> savedGameList = saveSet.ListSavedGames();
savedGameList.PushBack(KitString("blah"));
if (savedGameList.Count() > 0)
{
}
- 我有一个链接列表模板 class 完全在 .h 文件中的 dll 中声明和定义。
- 我在dll之外成功使用模板class,编译,链接,和运行
- 使用 class 中的某些函数会导致链接器错误。
savedGameList.Count() 导致 LNK2019,但 pushback() 和 getiterator() 不会。
好的,这让我开始构建,但我不知道它为什么有效:
将函数声明为:
template <class tmplt>
uint64_t Count()
{
return count;
}
并这样称呼它:
if (savedGameList.Count<KitString>() > 0)
显然编译器看不到该函数,因为它没有携带模板化类型(即使它在 class 声明的范围内)
正确答案是模板 class 不依赖于 dll,因为它需要的一切都在 header 中。所以 KIT_API 应该被删除。