我不明白,有人可以帮我解释一下吗?

时间:2019-12-29 21:09:12

标签: c++

以下是learncpp.com的模板类教程:

main.cpp

#include "Array.h"

int main()
{
    Array<int> intArray(12);
    Array<double> doubleArray(12);

    for (int count = 0; count < intArray.getLength(); ++count)
    {
        intArray[count] = count;
        doubleArray[count] = count + 0.5;
    }

    for (int count = intArray.getLength()-1; count >= 0; --count)
        std::cout << intArray[count] << "\t" << doubleArray[count] << '\n';

    return 0;
}

Array.h

#ifndef ARRAY_H
#define ARRAY_H

#include <assert.h> // for assert()

template <class T>
class Array
{
private:
    int m_length;
    T *m_data;

public:
    Array()
    {
        m_length = 0;
        m_data = nullptr;
    }

    Array(int length)
    {
        m_data = new T[length];
        m_length = length;
    }

    ~Array()
    {
        delete[] m_data;
    }

    void Erase()
    {
        delete[] m_data;
        // We need to make sure we set m_data to 0 here, otherwise it will
        // be left pointing at deallocated memory!
        m_data = nullptr;
        m_length = 0;
    }


    T& operator[](int index)
    {
        assert(index >= 0 && index < m_length);
        return m_data[index];
    }

    // The length of the array is always an integer
    // It does not depend on the data type of the array
    int getLength();
};

#endif

Array.cpp

#include "Array.h"

template <typename T>
int Array<T>::getLength() { return m_length; }

错误:未解析的外部符号“ public:int __thiscall Array :: getLength(void)”(?GetLength @?$ Array @ H @@ QAEHXZ)

说明:为了使编译器使用模板,它必须同时看到模板定义(不仅是声明)和用于实例化模板的模板类型。还请记住,C ++会分别编译文件。当Array.h标头包含在main中时,模板类定义将复制到main.cpp中。当编译器看到我们需要两个模板实例Array和Array时,它将实例化它们,并将它们作为main.cpp的一部分进行编译。但是,当开始单独编译Array.cpp时,它会忘记我们需要一个Array和Array,因此永远不会实例化模板函数。因此,由于编译器找不到Array :: getLength()或Array :: getLength()的定义,因此我们收到了链接器错误。

解释是什么意思?我很难理解Alex(learncpp的创建者)提供的解释。

1 个答案:

答案 0 :(得分:0)

// The length of the array is always an integer
// It does not depend on the data type of the array
int getLength();

的确,数组的长度不依赖于数据类型。但是,Array<double>::getLength()Array<int>::getLength()是两个不同的功能。仅当强制使用getLength()时,才能为所有模板实例实现inline。因此,无法在.cpp文件中实现它。