Вот моя проблема: я написал два базовых класса: Wire и CircuitComponent.Эти два были почти достаточно похожи, чтобы вывести из общего суперкласса, но не.Провод может соединяться только с CircuitComponent, а CircuitComponent может соединяться только с проводом.Реализации были идентичны, кроме типа, поэтому, естественно, я думал, что шаблоны были ответом.
Вот шаблон, и у меня есть класс Wire, производный от TwoTypeMesh<Wire, CircuitComponent>
и класс CircuitComponent, производный от TwoTypeMesh<CircuitComponent, Wire>
:
template <class thisType, class otherType>
class TwoTypeMesh {
std::set<otherType *> neighbors;
public:
void join(otherType * n){
if (neighbors.find(n) != neighbors.end()) {
return;
} else {
neighbors.insert(n);
n->join(this);
}
}
void disconnect(otherType * n){
if (neighbors.find(n) == neighbors.end()) {
return;
} else {
neighbors.erase(n);
n->disconnect(this);
}
}
};
Проблема в том, что я не могу заставить его скомпилировать, он жалуется на строку с n->join(this)
причина this
имеет тип TwoTypeMesh<Wire, CircuitComponent>
(суперкласс Wire
), но join
определен только для wire
.
Моя лучшая теория на данный момент заключается в том, что мне не следует создавать подклассы, может быть, typedef, но мне пока не удалось заставить его работать.