это необычно, но часто есть способы обойти это, в зависимости от ваших потребностей (возможно, уточните?).
понимаю, что имеет смысл передавать еще один бар в Foo.
в этом случае вы можете:
1) создайте второй параметр шаблона в Foo и выложите интерфейс, необходимый при построении:
template < typename T, typename Bar_ >
class Foo {
/* ... */
Foo(Bar_& bar) : weight_(bar.getWeight()) {
}
/* ... */
2) или просто используйте шаблон ctor:
template < typename Bar_ >
Foo(Bar_& bar) : weight_(bar.getWeight()) {
}
3) если Foo + Bar легковесен, вы можете просто создать расширенный список инициализации, используемый Bar в init.
4) поскольку это шаблон (а реализация должна быть видимой для его подкласса и иметь специальную связь), вы также можете объявить ctor Foo, который принимает Bar по указателю, а затем просто определить конструктор Foo в Bar.hpp