Странные C + шаблоны - PullRequest
       23

Странные C + шаблоны

5 голосов
/ 24 августа 2009

Таким образом, в основном, мы должны были создать двусвязный список, который шаблонизирован, а не привязан к одному типу данных. Я пытался компилировать как с помощью gcc, так и msvc, и оба компилятора выдают примерно одинаковые ошибки, поэтому я предполагаю, что это просто мое плохое кодирование, а не изворотливость одного или другого компилятора.

В настоящее время я получаю сообщения о том, что мои уроки в linkList.h не являются шаблоном

.. / linkList.h: 34: ошибка: «список» не относится к типу шаблонов
../linkList.h:143: ошибка: «iter» не является типом шаблона
../josephus.cpp:14: ошибка: «список» не является шаблоном
../josephus.cpp:14: ошибка: агрегатный список рассылки имеет неполный тип и не может быть определено
../josephus.cpp:15: ошибка: "iter" не является шаблон

linkList.h


template<typename T>
class iter
{
public:
iter()
{
    position = sentin;
    container = sentin->payload;
}

T get() const
{
    assert(position != sentin);
    return position->payload;
}

void next()
{
    position = position->next;
}

void previous()
{
    position = position->prev;
}

bool equals(iter itr) const
{
    return position == itr.position;
}
private:
node *position;
llist *container;
};

josephus.cpp


llist<int> ppl;
iter<int> pos;

int start = static_cast<int>(argv[1]) - 1;
int end = static_cast<int>(argv[2]) - 1;

Любая помощь в этом вопросе очень ценится

Ответы [ 3 ]

12 голосов
/ 24 августа 2009

Ваша предварительная декларация гласит: llist это класс:

class llist;

Тогда вы говорите, что это шаблон:

template<typename T>
class llist;

Аналогично с iter.

Я не знаю, как вы могли бы сделать его легко компилируемым. Тем не менее, вы можете сделать node и iter 'inside' из llist.

2 голосов
/ 24 августа 2009

Есть несколько проблем.

class A;

- это не способ, которым вы отправляете объявление шаблонного класса.

Если A имеет один шаблонный параметр, вам нужно сказать:

template<typename T>
class A;

Если вы говорите это после того, как уже сказали class A;, вы противоречите себе. Следующая проблема - simlar, friend class A;, если шаблон не будет работать, вам нужно сказать friend class A<T>; или подобное. Наконец, static_cast<int>(argv[1]) не скомпилируется (хотя бы static_cast<int>(argv[1][0]) будет, но все равно не хочет, чтобы вы хотели). Для значительного преобразования строки в целое число вам необходимо использовать atoi, strtol, stringstream и т. Д.

2 голосов
/ 24 августа 2009

Список не класс. Так что вперёд объявлять это бесполезным.

template<typename T> class llist;

Попытка компилировать код относительно проста.
Вы только что пропустили часть шаблона многих типов. Найдите список и узел iter и убедитесь, что у них есть соответствующий конец.

Если вы посмотрите на STL, то для удобства использования вы можете ввести некоторые внутренние типы. Вы могли бы следовать тому же принципу.

template<typename T>
class llist
{
     typedef iter<T>  Iter;
     typedef node<T>  Node;

      // The rest of the code.
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...