0

可能重复:
为什么模板只能在头文件中实现?

主班

   int main() {
      initCarList();
   }

   void initCarList() {
        List<Car> carList;
        Car c1 = Car("Toyota", "Bettle", 5);
        carList.add(c1);
        Car c2 = Car("Mercedes", "Bettle", 7);
        carList.add(c2);
        Car c3 = Car("FireTruck", "Large Van", 20);
        carList.add(c3);
        Car c4 = Car("Puma", "Saloon Car", 10);
        carList.add(c4);
    }

列表类

#include "List.h"
#include <iostream>

using namespace std;

template <typename ItemType>
class List {
private:
    ItemType itemList[10];
    int size;
public: 
    List();
    void add(ItemType);
    void del(int index);
    bool isEmpty();
    ItemType get(int);
    int length();
};

template<typename ItemType>
List<ItemType>::List() {
    size = 0;
}

template<typename ItemType>
void List<ItemType>::add(ItemType item) {
    if(size < MAX_SIZE) {
        itemList[size] = item;
        size++; 
    } else {
        cout << typename << " list is full.\n";
    }
}

我遇到了这样的错误

错误 3 错误 LNK2019:函数“void __cdecl initCarList(void )" (?initCarList@@YAXXZ) C:\Users\USER\Desktop\New 文件夹\DSA_Assignment\main.obj DSA_Assignment

我在我的代码中做错了什么吗?需要帮助谢谢!

4

2 回答 2

0

您的代码中存在语法错误 ( cout << typename)。我不知道你是如何得到链接器错误的。可能是它根本没有被编译。

否则没关系http://ideone.com/PGWGZu

于 2013-01-08T11:53:38.760 回答
0

显然你做了,因为它不起作用!抛开浮夸,让我们一点一点地看一下错误信息:

Error 3 error LNK2019: unresolved external symbol

所以这是一个链接错误。链接器试图将单独编译的单元放在一起,但在这种情况下,它找不到external symbol- 通常是函数或变量名。

"public: void __thiscall List::add(class Worker)" (?add@?$List@VWorker@@@@QAEXVWorker@@@Z)

这是您缺少的功能的完整签名。不幸的是,它的名字被管理了,但是根据您对正在编写的代码的上下文了解,您应该能够知道它是:

void List::add(Worker)

下一点...

referenced in function "void __cdecl initWorkerList(void)" (?initWorkerList@@YAXXZ) C:\Users\USER\Desktop\New folder\DSA_Assignment\main.obj DSA_Assignment

...告诉您问题发生在哪里,即它试图链接的代码中的哪里,有一个对丢失函数的引用。再一次,在拆解它之后:

void initWorkerList()

正如你所看到的,通过一点移植,你可以准确地确定你在这里做错了什么。希望这可以帮助。

于 2013-01-08T11:54:19.527 回答