“未定义的引用”模板类构造函数

“未定义的引用”模板类构造函数

我不知道为什么会发生这种情况,因为我认为我已经正确地声明和定义了所有内容。

我有以下程序,使用模板设计。这是一个简单的队列实现,其成员函数为“add”,“substract”和“print”。

我已经在精细的“nodo_colaypila.h”中为队列定义了节点:

#ifndef NODO_COLAYPILA_H#define NODO_COLAYPILA_H#include <iostream>template <class T> class cola;template <class T> class nodo_colaypila{
        T elem;
        nodo_colaypila<T>* sig;
        friend class cola<T>;
    public:
        nodo_colaypila(T, nodo_colaypila<T>*);};

然后在“nodo_colaypila.cpp”中实现

#include "nodo_colaypila.h"#include <iostream>template <class T> nodo_colaypila<T>::nodo_colaypila(T a, nodo_colaypila<T>* siguiente = NULL){
    elem = a;
    sig = siguiente;//ctor}

然后,队列模板类的定义和声明及其功能:

“cola.h”:

#ifndef COLA_H#define COLA_H#include "nodo_colaypila.h"template <class T> class cola{
        nodo_colaypila<T>* ult, pri;
    public:
        cola<T>();
        void anade(T&);
        T saca();
        void print() const;
        virtual ~cola();};#endif // COLA_H


但是当我构建时,编译器会在模板类的每个实例中抛出错误:

未定义引用`cola(float):: cola()'...(它实际上是cola'<'float'>':: cola(),但这不允许我这样使用它。)

等等。总共有17个警告,计算程序中调用的成员函数。

为什么是这样?那些函数和构造函数已定义。我认为编译器可以用“float”,“string”等替换模板中的“T”; 这是使用模板的优势。

我在这里读到,我应该将每个函数的声明放在头文件中由于某种原因。是对的吗?如果是这样,为什么?

提前致谢。


青春有我
浏览 1318回答 4
4回答

三级狗

我..... 我专门注册个号就是来吐槽的。  真当国人上不了谷歌吗? stackoverflow上原模原样的问题与答案真是辛苦你们了换四个号来搬运,而且字里行间充斥着翻译软件的不走心翻译2333

摇曳的蔷薇

此链接说明了您出错的地方:[35.12]为什么我不能将模板类的定义与其声明分开并将其放在.cpp文件中?将构造函数的定义,析构函数方法和诸如此类的东西放在头文件中,这样可以解决问题。这提供了另一种解决方如何使用模板函数避免链接器错误?但是,这需要您预测模板的使用方式,并且作为一般解决方案,这是违反直觉的。虽然你开发了一些内部机制使用的模板,但你想要警告它的使用方式,它确实解决了这个问题。
打开App,查看更多内容
随时随地看视频慕课网APP