链接错误与模板代码

时间:2013-07-03 14:08:12

标签: c++ templates

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

3 个答案:

答案 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