模板代码的链接错误

link errors with template code

本文关键字:链接 错误 代码      更新时间:2023-10-16

我有三个文件-main、Array.hh和Array.cc。当我执行"g++main.cc Array.cc"时,我会收到各种链接器错误,例如:"未定义对Array<<\double>>的引用::Array(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:

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

将定义从Array.cc放入Array.hh

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

您需要#include "Array.cc"

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

定义和声明的这种分离是可以的,但必须包括cc文件,在该文件中,您将使用新类型来安装该模板

您的建议不太准确。您不应该将模板分为.h和.cpp文件。如果你坚持要把它们分开,"导出"就是你要找的关键词。有关"导出"的更多信息,请查看此处:http://www.parashift.com/c++-faq/selecte-template-fn-defn-from-decl-export-keyword.html。