Проблемы с наследованием классов и прототипированием классов

В приведенном ниже упрощенном коде я пытаюсь в VS не допустить возникновения ошибки в операторе typedef, так как он не распознает B в этом операторе и выдаст ошибку «отсутствует»; до ‘<«».

template<class DT>
class A{
typedef B<DT> iterator;
}

template<class DT>
class B{
friend A<DT>;
}

И я понимаю, что вставка прототипа класса B должна решить эту проблему (источник: Класс прототипирования) но я все еще нахожу, что VS не распознает, что B существует до ввода оператора typedef, и все равно будет выплевывать ту же самую синтаксическую ошибку

class B; //prototype of B
template<class DT>
class A{
typedef B<DT> iterator;
}

template<class DT>
class B{
friend A<DT>;
}

И в случае переключения устройства на присвоение B сначала, а затем A, и изменение его на создание прототипа класса A, поскольку предполагается, что A является другом B, но компилятор еще не знает, что B существует. Я получаю сообщение об ошибке «отсутствует список аргументов для шаблона класса A».

class A; //prototype of B
template<class DT>
class B{
friend A<DT>;
}`
template<class DT>`
class A{
typedef B<DT> iterator;
}

И глядя на эту ошибку (источник: Список аргументов для шаблона класса отсутствуетЯ обнаружил, что вы изменили утверждение, взяв «» и добавив «шаблон» над ним. Который решает наследование между двумя классами, но это делает методы (в моем детальном коде) нашего класса A недоступными при тестировании функциональности. Любые идеи о том, как я должен сохранить то же наследство, но не сделать класс A чисто виртуальным, недоступным из другого источника (.cpp)?

1

Решение

Это должно работать для вас:

template<class DT> class B;

template<class DT>
class A{
typedef B<DT> iterator;
};

template<class DT>
class B{
friend A<DT>;
};
1

Другие решения

В моем подробном коде я обнаружил, что добавил ненужные экземпляры <DT> при определении моих классов, т.е. template <class DT> class AbstractLinkedList<DT> { ... } и поэтому, пытаясь сделать то, что предложил Измаил, и как Андрей прокомментировал создание полного прототипа класса шаблона, компилятор распознавал только первый экземпляр, а не второй, что вызвало появление других ошибок. Принимая эти дополнительные <DT>с наследованием классов согласились, так что, используя упрощенный код, использованный в моем вопросе, мой рабочий код соответствует

template<class DT> class A;

template<class DT>
class B{
friend A<DT>;
};

template<class DT>
class A{
typedef B<DT> iterator;
};
0

По вопросам рекламы [email protected]