我有3个文件 - main,Array.hh和Array.cc。当我执行“g ++ main.cc Array.cc”时,我会收到各种链接器错误,例如:“未定义的数组引用<< \ lt;<< \ lt;<<<
我使用模板读取了链接器错误的其他stackoverflow条目,但他们建议拆分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;
}
Array.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();
};
Array.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; }
答案 0 :(得分:0)
将Array.cc中的定义放入Array.hh
使用模板类时,会创建一个类。 Array.cc不知道应该从模板创建哪些类,只有main.cc知道这一点。 main.cc不知道如何创建类,因为它不知道Array的成员函数的定义,只有Array.cc知道。
答案 1 :(得分:0)
您需要#include "Array.cc"
如果定义不可用,则无法实例化模板。
这种定义和声明的分离很好,但是你必须包含cc
文件,无论你使用新类型设置该模板
答案 2 :(得分:0)
您采取的建议不是很准确。您不应将模板分成.h和.cpp文件。 如果您坚持将它们分开,“export”是您要查找的关键字。 有关“导出”的更多信息,请点击此处:http://www.parashift.com/c++-faq/separate-template-fn-defn-from-decl-export-keyword.html。