2011-06-30 34 views
1

有一個簡單的程序,其中,I可以插入一個字符串轉換爲靜態定義的大小的字符串數組20定義在C模板,誤差內++一類的一個新的對象:缺少模板參數

該程序的工作很好,直到我被指派改變它使用模板,所以代碼(與修改)將支持整數或字符串。

在包含的頭文件中使用類「Shelf」時,我不能再聲明以下對象int main(),「Shelf book;」 - 如果編譯器告訴我書還沒有被聲明,並且我缺少模板參數。

#include<iostream> 
#include<string> 

#define shelfSize 20 
template<class T> 
class Shelf{ 
    public: 
     Shelf();//default constructor 
     void insert(T&); 
    private: 
     string bookshelf[shelfSize]; 
     int counter; 
}; 
template< class T> 
Shelf<T>::Shelf(){ 
    for(int i=0; i <shelfSize; i++) 
     bookshelf[i]=""; 
    counter=0; 
} 
template< class T> 
void Shelf<T>::insert(T &booknum){ 
    bookshelf[counter] = booknum; 
    counter++; 
} 
int main(){ 
    Shelf book; 
    string isbn=""; 
    cout<<"Enter ISBN Number you wish to enter into the Array: "<<endl; 
    getline(cin, isbn); 
    book.insert(isbn); 
    return 0; 
} 

顯然,我大大淡化了我的程序,並希望關注實際給我的問題。正如我所說,我得到以下錯誤

所以說:「書」之前

缺少模板arguements;期望「;」在「書」之前。 「書」未申報。

回答

2

你需要指定一個參數T.模板需要與作爲參數傳遞的數據類型進行實例化,例如:

Shelf<std::string> book; 
1

您必須提供模板參數以告知編譯器要實例化模板系列的哪個類。使用Shelf<string> book;Shelf<int> book;

2

你應該使用:

Shelf<std::string> book; 

現在模板定義需要你指定哪個模板會被實例化的類型。

總之,在我看來,你還沒有完全完成模板實現,因爲你的會員:

string bookshelf[shelfSize]; 

仍然是「硬編碼」爲字符串;你可能想要:

T bookshelf[shelfSize]; 

所有相關的變化,這需要(構造函數等)。