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; }