-1

main、Array.hh、および Array.cc の 3 つのファイルがあります。"g++ main.cc Array.cc" を実行すると、あらゆる種類のリンカ エラーが発生します。たとえば、"undefined reference to Array<<\double>>::Array(int)" などです。

テンプレートを使用したリンカー エラーの他のスタック オーバーフロー エントリを読みましたが、HH ファイルと CC ファイルを分割することを推奨しています。これは既に行っています。では、ここで何が問題になるのでしょうか?

編集:返信ありがとうございます。以前に読んだ投稿を理解していませんでした。Array.cc を Array.hh にマージすると、問題が解決します。閉まっている。

main.cc:

#include "Array.hh"
#include <iostream>

int main() {
    Array<int> anArray(12);
    Array<double> adArray(12);

    for (int nCount = 0; nCount < 12; nCount++) {
        anArray[nCount] = nCount;
        adArray[nCount] = nCount + 0.5;
    }

    for (int nCount = 11; nCount >= 0; nCount--)
        std::cout << anArray[nCount] << "\t" << adArray[nCount]
        << std::endl;

    return 0;
}

配列.hh:

template <typename T>
class Array {
    private:
        int m_nLength;
        T *m_ptData;

    public:
        Array();
        Array(int nLength);
        ~Array();
        void Erase();
        T& operator[](int nIndex);
        int GetLength();
};

配列.cc

#include "Array.hh"
template <typename T>
Array<T>::Array() {
    m_nLength = 0;
    m_ptData = 0;
}

template <typename T>
Array<T>::Array(int nLength) {
    m_ptData= new T[nLength];
    m_nLength = nLength;
}

template <typename T>
Array<T>::~Array() { delete[] m_ptData; }

template <typename T>
void Array<T>::Erase() {
    delete[] m_ptData;
    m_ptData= 0;
    m_nLength = 0;
}

template <typename T>
int Array<T>::GetLength() { return m_nLength; }
4

3 に答える 3