在C ++中定义模板中类的新对象,错误:缺少模板参数

时间:2011-06-30 17:19:01

标签: c++ templates object

有一个简单的程序,我可以在其中将字符串插入到静态定义的大小为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;
 }

显然,我大大减少了我的计划,并希望专注于实际上给我一个问题。

所以我说我得到以下错误:

“书”之前缺少模板论证; 期待“;”在“书”之前。 “书”未宣布。

3 个答案:

答案 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;