Я немного новичок в шаблонах, и я не понимаю, как компилятор получает шаблоны для дочерних классов, когда я наследую от базового класса способом, которым я устанавливаю шаблоны.
Я создаю базовый класс генетического алгоритма, для которого я написал абстрактный базовый класс для отдельных лиц. Я хочу иметь общее определение, поэтому я использую шаблоны для определения фенотипа и генотипа:
template<typename T, typename S>
class individual {
public:
individual(S& fenotyp, T& genotyp) :
fenotype(fenotyp), genotype(genotyp) {}
...
S fenotype;
T genotype;
...
};
Когда люди являются цепочками, у меня есть следующий дочерний класс:
class bitstring_individual : public individual<boost::dynamic_bitset<>,
boost::dynamic_bitset<>> {
public:
using individual::individual;
...
};
Теперь мне больше не нужно работать с шаблонными скобками. Далее у меня есть функция, которая при численности населения std::vector<individual<T,S>>
возвращает половину с наивысшей пригодностью. Это работает для любого типа индивидуума, поэтому мы можем сохранить общее определение:
template<typename T, typename S>
std::vector<individual<T,S>> select_best_half(std::vector<individual<T,S>> parents,
std::vector<individual<T,S>> children) {
...
}
Однако, если я вызываю эту функцию, я получаю error: no matching function for call to select_best_half(...)
, и компилятор говорит template argument deduction/substitution failed:
и mismatched types ‘individual<T, S>’ and ‘bitstring_individual'
.
В определении bitstring_individual
мы видим, что:
bitstring_individual : individual<boost::dynamic_bitset<>,boost::dynamic_bitset<>>
так почему компилятор не понимает, что шаблоны должны быть boost::dynamic_bitset<>
? Может кто-нибудь помочь мне понять, как компилятор справляется с этим наследованием и как я могу это исправить?