Объединяя биты, кажется, это должно работать:

ода ниже:

#include <iostream>
#include <string>

using namespace std;

class Foo2;
class Foo3;

template <class T>
class Foo1 {
  public:
    Foo1();
    void print() {
      cout << "My name is: " << name << endl;
    }

    T getNext(){
      return nextLink;
    }

    string name;
    T nextLink;

};

class Foo2 : public Foo1 {
  public:
    Foo2(){
      name = "Foo2";
    }
};


class Foo3 : public Foo1 {
  public:
    Foo3(){
      name = "Foo3";
    }
};

template <class T>
class LinkedList {



public:
    T curr;
    T first;

void add(T node){
  if(first == NULL){
    first = node
  }
  node->nextLink = this;
  curr = node;
}
T getNext(){
  return next;
}
void printAll(){
  T curr = first;
  cout << "Contents are: " ;
  while(curr != NULL){
    cout << curr.print() << ", ";
    curr = curr.getNext();
  }
}

};

int main() {
  LinkedList<?> list;
  list.add(new Foo2());
  list.add(new Foo3());
  list.printAll();
  return 0;
}

Я пытаюсь реализовать общий связанный список, я понимаю, что я могу импортировать<list> но это не подошло бы моему проекту. Я пытаюсь иметь связанный списокFoo2 а такжеFoo3 объекты - выше, это лучшее, что я могу сделать, поскольку я новичок в C ++.

Ошибка:

generic.C: In instantiation of Foo1<Foo2>:
generic.C:26:   instantiated from here
generic.C:22: error: Foo1<T>::nextLink has incomplete type
generic.C:6: error: forward declaration of âclass Foo2
generic.C: In instantiation of Foo1<Foo3>:
generic.C:34:   instantiated from here
generic.C:22: error: Foo1<T>::nextLink has incomplete type
generic.C:7: error: forward declaration of class Foo3
generic.C: In member function void LinkedList<T>::add(T):
generic.C:50: error: expected ; before } token
generic.C: In member function T LinkedList<T>::getNext():
generic.C:55: error: ânextâ was not declared in this scope
generic.C: In function âint main()â:
generic.C:69: error: template argument 1 is invalid
generic.C:69: error: invalid type in declaration before â;â token
generic.C:70: error: request for member âaddâ in âlistâ, which is of non-class type âintâ
generic.C:71: error: request for member âaddâ in âlistâ, which is of non-class type âintâ
generic.C:72: error: request for member âprintAllâ in âlistâ, which is of non-class type âintâ
 Sebastian Paaske Tørholm16 янв. 2011 г., 14:57
И с какой проблемой вы столкнулись?
 jweyrich16 янв. 2011 г., 15:07
Почему неstd::list удовлетворить ваши потребности?
 Kay16 янв. 2011 г., 15:08
Не домашняя работа - связанные списки - это просто, но это не общие связанные списки.
 Sam Miller16 янв. 2011 г., 15:06
домашнее задание? если нет, то почему бы не использоватьstd::list?
 jalf16 янв. 2011 г., 17:02
поговоркаstd::list не "удовлетворить ваши потребности" абсурдно. Это хорошо реализованный связанный список. Если вам нужен хороший связанный список, это то, что вы должны использовать. И если вам нужно что-то еще, то нет смысла пытаться написать свой собственный связанный список. Извините, но есть вероятность, что 99,9%std::list является что вам нужно. последние 0,01% должны покрыть вероятность того, что это не так, и тогда ваша собственная реализация тоже не будет работать

Ответы на вопрос(4)

Объединяя биты, кажется, это должно работать:

int main() {
  std::list<boost::variant<Foo2, Foo3> > list;
  list.push_back(Foo2());
  list.push_back(Foo3());
  printAll(list); // You'd still need to write this obviously.
  return 0;
}

пример, который вы привели, может быть решен с помощьюstd::list:

std::list<Foo1 *> list;

list.push_back(new Foo2());
list.push_back(new Foo3());

for (std::iterator<Foo1 *> it = list.begin(); it != list.end(); ++it)
{
    (*it)->print();
}

Очевидно, здесь есть потенциальная утечка памяти ...

а не T. Похоже, вы пришли из Java, где все является ссылкой. Здесь нет? в шаблонах C ++. Я думаю, что вам нужно сначала взять книгу по базовому C ++, а затем вернуться к шаблонам.

 Kay16 янв. 2011 г., 15:08
"?" это для обозначения моего незнания того, что должно быть там.
 Puppy16 янв. 2011 г., 15:26
@ Кей: О, хорошо. Я думал, что вы имели в виду Java? который является допустимым общим аргументом. Однако в вашем коде так много неправильного, что вам нужна книга.
Решение Вопроса

Если это так, то вы должны использоватьLinkedList<Foo1 *>.

Почему вы не можете использовать std :: list? Может быть, мы можем помочь вам с этим, будет гораздо лучше, если вы используете вашу собственную реализацию.

 Kay16 янв. 2011 г., 15:17
Я не могу использовать std :: list, потому что я хотел бы создать LinkedList с несколькими вариантами выбора для своего следующего узла - из которых он выбирает один случайным образом.
 MatiasFG17 янв. 2011 г., 17:00
Это было бы еще лучше, спасибо!
 MatiasFG16 янв. 2011 г., 15:25
Я вижу, как насчет использования std :: list <MultipleChoice>? Это может позволить вам использовать std :: list и дать вам группу «вариантов выбора». Я думаю, что лучше всего не думать о списке, а вместо этого сосредоточиться на абстрагировании вашей проблемы.
 MSalters17 янв. 2011 г., 09:51
MultipleChoice ? Почему не простоstd::list<boost::variant<Foo2, Foo3> > ?

Ваш ответ на вопрос