【发布时间】:2018-05-14 14:28:24
【问题描述】:
我对模板有些陌生,当我以设置模板的方式从基类继承时,我不明白编译器如何为子类派生模板。
我正在创建一个遗传算法基类,为此我为群体中的个体编写了一个抽象基类。我想要一个通用的定义,所以我使用模板来定义 fenotype 和 genotype:
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<>?有人可以帮助我了解编译器如何处理这种继承以及如何修复它?
【问题讨论】:
-
minimal reproducible example 会更好,更干净,而不是大量的文字。
标签: c++ templates inheritance