在使用c ++模板时复制构造函数的未定义引用

时间:2012-12-06 01:20:32

标签: c++ templates linker-errors

  

可能重复:
  Why can templates only be implemented in the header file?

我正在尝试练习C ++模板,在执行此操作时,g ++给了我以下链接器错误:

g++ main.o list.o -o app
main.o: In function `main':
main.cpp:(.text+0x27): undefined reference to `List<int>::List(List<int> const&)'
collect2: ld returned 1 exit status
make: *** [app] Error 1

我尝试在我的主要内容中执行以下操作:

#include "List.h"

int main() {
    List<int> a;
    List<int> b(a);
    return 0;
}

而我的List.h看起来像:

#ifndef LST_H
#define LST_H

template <typename T>
class List {
    public:
    template <typename TT> class Node;
    private:
    Node<T> *head;
    public:
    List() { head = new Node<T>; }
    ~List() { delete head; }
    List( const List &l );

    template <bool DIM> class iterable_frame;
    template <bool DIM> class supervised_frame {
        iterable_frame<DIM> sentinels;
        iterable_frame<DIM> data;
        bool sentinel_completeness;

        public:
        supervised_frame( const List& );
        ~supervised_frame() {}
        void copy_sentinels( iterable_frame<DIM>& );
        void copy_cells( iterable_frame<DIM>& );
    };
    template <bool DIM> class iterable_frame {
        Node<T> *head;
        Node<T> *caret;

        public:
        iterable_frame( const List& );
        ~iterable_frame() {}
        inline bool end() { return head == caret; }
    };
    template <typename TT> class Node {
        unsigned index[2];
        TT num;
        Node<TT> *next[2];
        public:
        Node( unsigned x = 0, unsigned y = 0 ) { index[0]=x; index[1]=y; next[0] = this; next[1] = this; }
        Node( unsigned x, unsigned y, TT d ) { index[0]=x; index[1]=y; num=d; next[0] = this; next[1] = this; }
        ~Node() {}
        friend class List;
    };
};

#endif

和我的List.cpp一样:

#include <iostream>
#include "List.h"

template <typename T>
List<T>::List( const List<T> &l ) {
    head = new Node<T>;
    iterable_frame<1> in(l);
    supervised_frame<1> out(*this);
}

template <typename T> template <bool DIM>
List<T>::supervised_frame<DIM>::supervised_frame( const List<T> &l  ) {
    std::cout << DIM << std::endl;
}
template <typename T> template <bool DIM>
void List<T>::supervised_frame<DIM>::copy_sentinels( iterable_frame<DIM>& ) {}
template <typename T> template <bool DIM>
void List<T>::supervised_frame<DIM>::copy_cells( iterable_frame<DIM>& ) {}

template <typename T> template <bool DIM>
List<T>::iterable_frame<DIM>::iterable_frame( const List<T> &l ) {
    std::cout << '\t' << DIM << std::endl;
}

代码仍然是草稿,但我会解释一下我的意图。背后的想法是我想要一个可以作为稀疏矩阵的类List,所以我制作了第一个模板,可以在存储的数字类型(int,float等)之间轻松切换。然后我创建了两个类似辅助迭代器的类来处理元素,这些类也是由模板实现的,因为迭代的方向可以是双向的 - 按列方式或按行方式,不同的矩阵方法会选择最适合它们的方法。 。列表是一个二维环。

1 个答案:

答案 0 :(得分:1)

您在类定义中声明的唯一复制构造函数是:

List( const List &l );

它没有可见实现(作为模板和所有),错误。将实现移动到标题。