2013-03-07 79 views
11

我有一個好奇的問題,我不太確定問題是什麼。我創建了一個名爲LinkedArrayList類使用類型名模板,如下面的代碼:類模板的參數列表丟失

#pragma once 

template <typename ItemType> 

class LinkedArrayList 
{ 

private: 

class Node { 
    ItemType* items; 
    Node* next; 
    Node* prev; 
    int capacity; 
    int size; 
}; 

Node* head; 
Node* tail; 
int size; 

public: 

void insert (int index, const ItemType& item); 
ItemType remove (int index); 
int find (const ItemType& item); 
}; 

現在,這不會給任何錯誤或問題。但是,在.cpp文件中創建函數會給我錯誤「類模板」LinkedArrayList「的參數列表丟失。」它還說ItemType是未定義的。下面是代碼,很簡單,在.cpp:

#include "LinkedArrayList.h" 

void LinkedArrayList::insert (int index, const ItemType& item) 
{} 

ItemType LinkedArrayList::remove (int index) 
{return ItemType();} 

int find (const ItemType& item) 
{return -1;} 

它看起來有事情做與模板,因爲如果我把它註釋掉,並更改功能,以整數的ItemTypes,它不沒有任何錯誤。另外,如果我只是在.h中完成所有的代碼而不是單獨的.cpp,它也可以工作。

任何幫助問題的來源將不勝感激。

謝謝。

回答

13

首先,這是你應該怎樣一類模板的成員函數提供了一個定義:

#include "LinkedArrayList.h" 

template<typename ItemType> 
void LinkedArrayList<ItemType>::insert (int index, const ItemType& item) 
{} 

template<typename ItemType> 
ItemType LinkedArrayList<ItemType>::remove (int index) 
{return ItemType();} 

template<typename ItemType> 
int LinkedArrayList<ItemType>::find (const ItemType& item) 
{return -1;} 

其次,這些定義不能放在一個.cpp文件,因爲編譯器將不能夠從它們的調用點隱式地實例化它們。參見例如this Q&A on StackOverflow