Вопрос в том, нужно ли Outer
изменить Inner
до in
. Если это так, вы должны оставить in
как Inner &
. В этом случае, если у вас есть const Inner &
, то, конечно, вы не можете передать его Outer
, потому что ссылка не позволяет вам изменять ссылочную Inner
, но Outer
нужно изменить Inner
.
Если Outer
не нужно изменять Inner
, то вам нужно просто написать in
как const Inner &
, и в этом случае Outer
можно инициализировать либо с помощью Inner &
, либо * 1019. *.
Вы, конечно, можете написать:
class Inner {};
template <class T>
class Outer {
T& in;
public:
Outer(T& in) : in(in) {}
};
, а затем инициализировать объекты типа Outer<Inner>
или Outer<const Inner>
. Но Outer
должен сделать что-то другое в этих двух случаях, иначе вы могли бы просто сделать in
a const Inner &
. И в этом случае вам, вероятно, лучше написать отдельные классы, так что ясно, что Outer
делает что-то другое.