重複の可能性:
テンプレートをヘッダーファイルにのみ実装できるのはなぜですか?
私は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;
}
コードはまだドラフトのようなものですが、私の意図を少し説明します。背後にある考え方は、スパース行列として機能できるクラスリストが必要だったため、格納されている数値タイプ(int、floatなど)を簡単に切り替えるための最初のテンプレートを作成しました。次に、要素を処理するための2つの補助イテレーターのようなクラスを作成します。これは、テンプレートによっても実装されます。反復の方向は、列方向または行方向の2つであり、さまざまなマトリックスメソッドがそれらに最適なクラスを選択するためです。 。そして、リストは二次元のリングになります。