Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板类的链接器错误_C++ - Fatal编程技术网

C++ 模板类的链接器错误

C++ 模板类的链接器错误,c++,C++,我正在尝试使用自定义模板链接列表类实现粒子系统,并获取链接器错误: 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)

我正在尝试使用自定义模板链接列表类实现粒子系统,并获取链接器错误:

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)*
错误3错误LNK2019:未解析的外部符号“public:struct Node*u thiscall LinkedList::Pop(void)”(?Pop@$LinkedList@VParticle@@@@QAEPAU$Node@VParticle@@@@XZ)在函数“private:void _thiscall ParticleEmitter::addParticles(void)”中引用(?addParticles@ParticleEmitter@@AAEXXZ)*
这是节点。h:

template <class T>
struct Node
{
    Node(const T&);
    ~Node();
    T* value;
    Node* previous;
    Node* next;
};
模板
结构体类型
{
节点(常数T&);
~Node();
T*值;
节点*先前;
节点*下一步;
};
以下是addParticle代码:

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));
    }

}
LinkedList自由粒子//分词中的定义
void ParticleEmitter::添加粒子(void)
{
int numParticles=RandomGetInt(最小粒子,最大粒子);
对于(int i=0;ivalue->init(颜色,
立场,,
方向*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;
}
//从后面弹出
模板
节点*链接列表::Pop()
{   
if(IsEmpty())返回NULL;
节点*节点=最后一个;
最后一次=最后一次->上一次;
if(last!=NULL)
{
last->next=NULL;
如果(last->previous==NULL)head=last;
}
else head=NULL;
node->previous=NULL;
节点->下一步=空;
返回节点;
}

我从头开始编写所有代码,因此可能是我在某个地方犯了错误,而且我对模板也不熟悉。

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

@Mikhail:所以将其移动到标题处。可能的重复项(以及无数的重复项,但这一项有一个很好的“说教式”的公认答案)