以下是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的创建者)提供的解释。
答案 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文件中实现它。