有一个简单的程序,我可以在其中将字符串插入到静态定义的大小为20的字符串数组中。
这个程序运行得很好,直到我被指定将其更改为使用模板,因此代码(带修改)将支持整数或字符串。
在包含的标题中使用Class“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;
}
显然,我大大减少了我的计划,并希望专注于实际上给我一个问题。
所以我说我得到以下错误:
“书”之前缺少模板论证; 期待“;”在“书”之前。 “书”未宣布。
答案 0 :(得分:2)
您应该使用:
Shelf<std::string> book;
现在模板定义需要您指定模板将被实例化的类型。
无论如何,在我看来,由于你的成员:
,你还没有完全完成模板实现 string bookshelf[shelfSize];
仍然是“硬编码”字符串;你可能想要:
T bookshelf[shelfSize];
包含所需的所有相关更改(构造函数等)。
答案 1 :(得分:2)
您需要为T指定一个参数。模板需要使用作为参数传递的数据类型进行实例化,如下所示:
Shelf<std::string> book;
答案 2 :(得分:1)
您必须提供模板参数以告知编译器要实例化模板系列的哪个类。使用Shelf<string> book;
或Shelf<int> book;