1

独自のベクター クラスを作成しています。

.h:

template<typename T>
class MyVector
{
private:
    T *elements;
    int elementCount;
public:
    MyVector();
    MyVector(int size);
    void push_back(T value);
    void pop_back();
    int size();
    T at(int index);
    bool empty();
    void clear();
    void swap(MyVector v2);
};

.cpp:

template<typename T>
MyVector<T>::MyVector()
{
    elementCount = 0;
    elements = new int[elementCount];
    elements = (int *) realloc (elements, elementCount * sizeof(int));
}

main.cpp:

#include "MyVector.h"

int main()
{
    MyVector<char> myTestVector;   
    return 0;
}

MyVector オブジェクトを単純に作成しようとするとエラーが発生します。エラーは次のとおりです。

MyVector::MyVector()、参照元: main.o ld の _main: アーキテクチャ x86_64 のシンボルが見つかりませんでした。clang: エラー: リンカー コマンドが終了コード 1 で失敗しました (-v を使用して呼び出しを確認してください)

私は元々、すでに指定された型で動作するようにクラスを作成しましたが、今では任意の型で動作する必要があります。

このエラーが発生するのはなぜですか? 前もって感謝します!

4

1 に答える 1

5

C++ テンプレートでは、ヘッダー ファイルに定義が必要です。これは、コンパイラがコンパイル時にインスタンス化された型ごとにオブジェクト ファイルを生成するためです。宣言を .h ファイルに移動すると、コードは正常にリンクされるはずです。

テンプレートがどのように/なぜ機能するかについての適切な概要については、こちらを参照してください。

于 2013-10-07T17:53:43.280 に答える