C++ 链接错误与模板代码

C++ 链接错误与模板代码,c++,templates,C++,Templates,我有3个文件-main、Array.hh和Array.cc。当我执行“g++main.cc Array.cc”时,会出现各种链接器错误,例如:“未定义对数组的引用::数组(int)” 我阅读了其他stackoverflow条目中的链接器错误模板,但他们建议拆分HH和CC文件,我已经这样做了。那么这里有什么问题呢 编辑:谢谢你的回复。我不理解我以前读过的帖子。将Array.cc合并到Array.hh解决了这个问题。关闭 main.cc: #include "Array.hh" #include &

我有3个文件-main、Array.hh和Array.cc。当我执行“g++main.cc Array.cc”时,会出现各种链接器错误,例如:“未定义对数组的引用::数组(int)”


我阅读了其他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”
#包括
int main(){
阵列阵列(12);
阵列天线(12);
对于(int-nCount=0;nCount<12;nCount++){
anArray[nCount]=nCount;
adArray[nCount]=nCount+0.5;
}
对于(int-nCount=11;nCount>=0;nCount--)

std::cout将Array.cc中的定义放入Array.hh

使用模板类时,会创建一个类。Array.cc不知道应该从模板创建哪些类,只有main.cc知道。main.cc不知道如何创建类,因为它不知道数组成员函数的定义,只有Array.cc知道。

您需要
包括“Array.cc”

如果模板的定义不可用,则无法实例化模板


定义和声明的这种分离是可以的,但是您必须包括
cc
文件,您在其中使用新类型安装该模板您所采取的建议不是非常准确。您不应该将模板分为.h和.cpp文件。 如果你坚持把它们分开,“导出”是你要找的关键词。
有关“导出”的更多信息,请点击此处:。

“我阅读了其他stackoverflow条目,查找模板中的链接器错误,但他们建议拆分HH和CC文件”-他们不建议这样做,这正是导致错误的原因。
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();
};
#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; }