模板c++中未解决的外部错误

unresolved external error in templates c++

本文关键字:外部 错误 未解决 c++ 模板      更新时间:2023-10-16

我在C++代码中遇到以下未解决的外部错误:

错误1错误LNK2019:函数__mainCRTStartup中引用的未解析外部符号_main

错误2错误LNK1120:1未解析的外部

我有一个抽象的父类和一个实现所有函数的派生类。然而,由于一些奇怪的原因,我出现了这个错误。如果我在没有模板的情况下编辑这段代码,它运行得很好。这是代码:

#include <iostream>
#include <conio.h>
using namespace std;
template <class E>
class List{
public:
List(){};
virtual ~List(){};
virtual void insert(const E& it) = 0;
};
template<class E>
class Alist : public List<E>{
private:
int maxSize;
int listSize;
int curr;
int biggest;
E* listArray;
public:
Alist(){
    maxSize = 50;
    listSize = 0;
    biggest = 0;
    curr = 0;
    listArray = new E[maxSize];
}
~Alist(){
    delete[] listArray;
}
void insert(const E& it){
    if (curr <0 || curr >= maxSize){
        cout << "The value is out of bounds.";
        return;
    }
    for (int i = listSize; i >= curr; i--){
        listArray[i] = listArray[i + 1];
    }
    if (curr > biggest)
        biggest = curr;
    listArray[curr] = it;
    listSize++;
}

};
template <class E>
int main(){

Alist<int> A();

_getch();
return 0;
}
  1. 不要将main声明为函数模板:

    template <class E>
    int main(){
    

    应该是:

    int main(){
    
  2. 以下代码:

    Alist<int> A();
    

    是一个不带参数并返回Alist<int>的函数的声明,它应该是:

    Alist<int> A{}; //c++11
    

    或:

    Alist<int> A;
    
  3. 不要使用<conio.h>标头,它不是标准标头。

  4. 不要在delete语句中的[]括号之间插入任何内容:

    delete[curr] listArray;
    

    应该是:

    delete[] listArray;    
    

工作演示

主函数不应该是模板。编译器正在寻找一个非模板主函数作为入口点。

只需在main声明之前删除template <class E>。这在这里没有意义。

如果你真的想要一个模板主函数,你应该从一个非模板函数调用它:

namespace my {
    template <class E>
    int main(){
        Alist<E> A;
        _getch();
        return 0;
    }
}
int main()
{
    return my::main<int>();
}

但我不认为这样做有什么意义。