C++模板类的构造函数放在类外写的话显示无法解析的符号

#pragma once
#ifndef _ARRAYLIST_
#define _ARRAYLIST_
#include<iostream>
#include <exception>

template<class T>
class ArrayList
{
private:
    T* elementData;
    int size = 0;
    int length = 0;
    T* DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
public:
   // ArrayList(int initalCapacity);
    ArrayList();
};


#endif

#include "ArrayList.h"
template<class T>
ArrayList<T>::ArrayList()
{
    this->elementData = this->DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}

在调用构造函数的时候出现无法解析的符号错误

你这是把模板类的构造函数“声明和定义”分开写了?这样是不行的,因为模板类不是类,模板函数也不是函数(听起来很奇怪对吧),所以不能按类和函数那样分开写。只有经过实例化的模板类才是类,经过实例化的模板函数才是函数。C++的模板语法非常复杂,仅凭一个“模板声明”,C++编译器是无法知道它应该做什么的,这点和类和函数是非常不同的。这时最常见的选择是把模板类函数实现写到与模板类声明的同一个文件里边。

不知道LTO(Linkage Time Optimization,链接时优化)或者微软的全局优化能不能在不必放进同一个文件的情况下成功编译,也可以先试试。具体方法是资源管理器右键项目,选属性,具体位置有点不记得但总之C++高级设置和链接器设置里分别有一个“全程序优化”,把这玩意打开(只打开二者之一的话可能没啥用)。

如果你是命令行用户,使用/GL选项:https://docs.microsoft.com/zh-cn/cpp/build/reference/gl-whole-program-optimization?view=msvc-160

纠正:上文“实例化”应为“全特化”(full specialization),通俗地讲就是,你得把一个模板类所有模板参数全部显式指定,才算是全特化了。

放心,就算放在一个文件里也不会导致符号重定义(除非出现了其他奇怪的冲突)。