-1

我有 3 个文件 - main、Array.hh 和 Array.cc。当我执行“g++ main.cc Array.cc”时,会出现各种链接器错误,例如:“undefined reference to Array<<\double>>::Array(int)”

我使用模板阅读了其他 stackoverflow 条目以了解链接器错误,但他们建议拆分 HH 和 CC 文件,我已经这样做了。那么这里有什么问题呢?

编辑:感谢您的回复。我不明白我以前读过的帖子。将 Array.cc 合并到 Array.hh 中解决了这个问题。关闭。

主.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

0

Put the definitions from Array.cc into Array.hh

When a template class is used, a class is created. Array.cc does not know which classes should be created from the template, only main.cc knows that. main.cc does not know how to create the classes, because it does not know the definition of the member functions of Array, only Array.cc knows that.

于 2013-07-03T14:12:18.857 回答
0

你需要#include "Array.cc"

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

定义和声明的这种分离很好,但是无论您要cc使用新类型将该模板实例化的任何位置,都必须包含该文件

于 2013-07-03T14:13:03.680 回答
0

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

于 2013-07-03T14:17:03.700 回答