c++ - LNK2019 在某些类函数上,但在其他类函数上没有(dll 中的模板类)

标签 c++ templates dll lnk2019

好的,不包括整个代码库......

#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)
{
}
  1. 我有一个链接列表模板类,它完全在 .h 文件中的 dll 中声明和定义。
  2. 成功使用dll外的模板类,编译、链接、运行
  3. 使用类中的某些函数会导致链接器错误。

savedGameList.Count() 会导致 LNK2019,但 pushback() 和 getiterator() 不会。

最佳答案

正确的答案是模板类不依赖于 dll,因为它需要的一切都在头文件中。所以 KIT_API 应该被删除。

关于c++ - LNK2019 在某些类函数上,但在其他类函数上没有(dll 中的模板类),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43222591/

相关文章:

c++ - 模板函数定义的编译错误

c++ - std::列表迭代器

c++ - 模板和 g++ 4.7

c++ - 为什么我们需要在这个模板函数实现中将求值表达式包装在 void(...) 内?

c - 使用 VirtualQueryEx 枚举远程进程中的模块不会返回所有模块

c++ - 如果内存未被其他任何引用,则释放指针

c++ - 这个模板语法非法吗?

c# - 无法加载文件或程序集 'Leadtools.Codecs',如果有人熟悉 leadtools

c# - Web API 无法引用 DLL

c++ - QT什么时候不允许一行多次转换,比如QString to char*