Полиморфный вектор шаблона

#c #inheritance #polymorphism

Вопрос:

Я пытаюсь создать своего рода двойную полиморфную карту в C .

У меня есть что-то вроде этого:

 class Base{ };  class Derived : Base{ };  template lt;typename Tgt; class ClassTemplate{  std::vectorlt;Tgt; vec; };  class TemplatedBase : ClassTemplatelt;Basegt;{ };  class TemplatedDerived : ClassTemplatelt;Derivedgt;{ };   

Я хочу создать функцию, которая принимает a std::maplt;std::string, ClassTemplatelt;Basegt;gt; (или указатели значений) и сможет использовать полиморфизм для передачи объектов типа std::maplt;std::string, TemplatedDerivedgt; .

В настоящее время я могу добиться чего-то частично правильного, сделав аргумент a std::maplt;std::string, ClassTemplatelt;Derivedgt;*gt; и создав его из a std::maplt;std::string, TemplatedDerivedgt; . Однако это не сработает, если бы я хотел заставить его работать std::maplt;std::string, ClassTemplatelt;Basegt;*gt; .

Я получаю ошибку: недопустимая инициализация ссылки типа » std::картаlt;std::строка, шаблон, архивированныйamp;» из выражения типа » std::картаlt;std::строка, табличка класса*gt;».

Есть ли способ заставить это работать для универсальной функции для карт с ClassTemplatelt;Basegt; помощью ?

Комментарии:

1. Нет, к сожалению, C так не работает. Не имеет значения, какие классы A и B являются ли они классами или экземплярами шаблонов, но std::maplt;std::string, Agt; не являются суперклассом std::maplt;std::string, Bgt; , независимо от того, как A и B связаны друг с другом, является ли один из них подклассом A или B или нет. Это фундаментально для C .