Нет общего типа между A
и B
. Таким образом, T
не может иметь какого-либо определенного типа.
Давайте поставим себя на место компилятора. Как мы выясним, что такое T
?
Давайте попробуем T = A
. Это терпит неудачу, когда мы пытаемся сделать это:
T item = B();
Аналогично, T = B
завершается неудачно, когда мы пытаемся сделать это:
T item = A();
К сожалению, мы не можем явно создать тип, который работает как с A
, так и с B
, так как они не имеют общих позиций.
Поскольку вы упомянули, что A
и B
соответствуют разным типам файлов, позвольте мне предложить решение:
switch(filetype) {
case FILETYPE_A:
a = A::Load(filename);
print << a.text << std::endl; // do stuff with a
break;
case FILETYPE_B:
b = A::Load(filename);
b.show_image(); // do stuff with b
break;
};
Это проще, чем создание универсального контейнера для разных файлов. Создание универсального контейнера означает, что вы строго ограничены только общими операциями, которые можно выполнять со всеми файлами.
Как показано в приведенном выше примере, они не имеют одинаковые возможности (один текст, а другой изображение). Если вы не можете определить общий интерфейс между этими файлами, просто не имеет смысла иметь универсальный тип.
Если вы действительно хотите какое-то общее решение, вы можете подумать:
- Общий интерфейс класс, который
A
и B
наследуют от
- Адаптер шаблон