В приведенном ниже упрощенном коде я пытаюсь в 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)?
Это должно работать для вас:
template<class DT> class B;
template<class DT>
class A{
typedef B<DT> iterator;
};
template<class DT>
class B{
friend A<DT>;
};
В моем подробном коде я обнаружил, что добавил ненужные экземпляры <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;
};