Это скорее вопрос наилучшей практики, чем вопрос языка сам по себе, поскольку у меня уже есть рабочее решение того, что кажется общим камнем преткновения в C ++.
Я имею дело с типичной проблемой циклической зависимости при замене параметров шаблона. У меня есть следующая пара классов:
template<class X>
class A { /* ... */ };
template<class X>
class B { /* ... */ };
и я хочу создать каждый экземпляр следующим образом:
// Pseudocode -- not valid C++.
A<B> a;
B<A> b;
то есть я хочу «связать» A с B, а B с A.
Я могу решить проблему, грубо говоря, с помощью предварительной декларации с уловкой наследования:
class sA;
class sB;
class sA : public A<sB> { /* ... */ };
class sB : public B<sA> { /* ... */ };
но это порождает ряд проблем, поскольку sA
и sB
на самом деле не A
и B
. Например, я не могу вызвать конструкторы A
, не продублировав их должным образом в sA
или не свернув каким-либо образом код вокруг кода.
Мой вопрос: каков наилучший практический способ решения этой проблемы? Какое-нибудь особенно умное решение этой проблемы?
Я использую MSVC2008 и G ++, но приветствуются решения с расширениями, специфичными для компилятора.
Спасибо
Alek