Определение нового объекта класса в шаблоне в C ++, ошибка: отсутствуют аргументы шаблона - PullRequest
1 голос
/ 30 июня 2011

Имеем простую программу, где я могу вставить строку в статически определенный массив строк размером 20.

Эта программа работала очень хорошо, пока мне не было поручено изменить ее на использование шаблонов, поэтому код (с модификацией) будет поддерживать интергеры или строки.

Используя класс "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 ]

2 голосов
/ 30 июня 2011

Вы должны использовать:

   Shelf<std::string> book;

теперь для определения шаблона необходимо указать тип, для которого будет создан экземпляр шаблона.

В любом случае, мне кажется, что вы не полностью завершили реализацию шаблона, поскольку ваш участник:

   string bookshelf[shelfSize];

все еще «жестко закодирован» как строка; вы можете захотеть:

 T bookshelf[shelfSize];

со всеми связанными изменениями, которые для этого требуются (конструкторы и т. Д.).

2 голосов
/ 30 июня 2011

Необходимо указать параметр для T. Необходимо создавать экземпляры шаблонов с типом данных, переданным в качестве параметра, например:

Shelf<std::string> book;
1 голос
/ 30 июня 2011

Вы должны предоставить аргумент шаблона, чтобы сообщить компилятору, какой класс семейства шаблонов нужно создать.Используйте Shelf<string> book; или Shelf<int> book;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...