模板类的链接器错误

Posted

技术标签:

【中文标题】模板类的链接器错误【英文标题】:Linker error with template class 【发布时间】:2011-07-17 17:46:41 【问题描述】:

我正在尝试使用我的自定义模板链表类来实现粒子系统并得到链接器错误:

Error   3   error LNK2019: unresolved external symbol "public: struct Node<class Particle> * __thiscall LinkedList<class Particle>::Pop(void)" (?Pop@?$LinkedList@VParticle@@@@QAEPAU?$Node@VParticle@@@@XZ) referenced in function "private: void __thiscall ParticleEmitter::addParticles(void)" (?addParticles@ParticleEmitter@@AAEXXZ)*

这里是 Node.h:

template <class T>
struct Node

    Node(const T&);
    ~Node();
    T* value;
    Node* previous;
    Node* next;
;

这是添加粒子的代码:

LinkedList<Particle> freeParticles; //definition in ParticleEmitter.h

void ParticleEmitter::addParticles(void)

    int numParticles = RandomGetInt(minParticles, maxParticles);

    for (int i = 0; i < numParticles && !freeParticles.IsEmpty(); i++)
    
        // grab a particle from the freeParticles queue, and Initialize it.

        Node<Particle> *n = freeParticles.Pop();
        n->value->init(color, 
            position, 
            direction * RandomGetFloat(velMin, velMax), 
            RandomGetFloat(lifetimeMin, lifetimeMax));
    


这里是 Pop 函数:

//Pop from back
template <class T>
Node<T>* LinkedList<T>::Pop()
   
    if (IsEmpty()) return NULL;

    Node<T>* node = last;
    last = last->previous;

    if (last != NULL) 
    
        last->next = NULL;
        if (last->previous == NULL) head = last;
    
    else head = NULL;

    node->previous = NULL;
    node->next = NULL;

    return node;

我正在从头开始编写所有代码,所以也许我在某个地方犯了一个错误,而且我也是模板新手。

【问题讨论】:

Template operator linker error 的可能副本(还有更多,但这个有一个很好且“说教”的公认答案) 【参考方案1】:

您是否在源文件(例如 .cpp)而不是头文件中定义了 Pop 函数?你不能用模板那样做。您需要在头文件中提供函数定义。定义需要在实例化时可见。

【讨论】:

@Mikhail:所以把它移到标题。

以上是关于模板类的链接器错误的主要内容,如果未能解决你的问题,请参考以下文章

变量模板的链接器错误

实例化模板类时出现链接器错误

在 OCUnit 中使用核心数据类的 Apple Mach-O 链接器错误

在另一个项目中包含继承类时抽象类的链接器错误

实现 pimpl idiom 时出现链接器错误

为 iOS 构建 OCUnit 应用程序测试目标时出现链接器错误