Я объявил шаблон класса следующим образом:
template<typename T>
class C{
public:
C(T&,
shared_ptr<C<T>>&
);
// rest of the public interface
private:
T& rData;
shared_ptr<C<T>>& rP;
};
Впоследствии я определил конструктор шаблона следующим образом:
template<typename T> C<T>::C(T& rDataArg,
shared_ptr<C<T>>& rPArg
):rData(rDataArg),
rP(rPArg)
{}
Для приведенного выше определения я получил следующее -Wreorder
предупреждение от компилятора g ++:
предупреждение: поле «rData» будет инициализировано после поля «rP»
[- Wreorder]
Я изменил порядок инициализации в своем определении конструктора, и предупреждение исчезло.
Поскольку оба члена класса шаблона являются ссылками, мне любопытно, почему инициализация в конструкторе должна соответствовать порядку, указанному компилятором.
Пожалуйста, поделитесь своими мыслями.
Поскольку оба члена класса шаблона являются ссылками, мне любопытно, почему инициализация в конструкторе должна соответствовать порядку, указанному компилятором.
Это не указано компилятором, это указано вы. Вы указываете это прямо здесь:
template<typename T>
class C{
private:
T& rData; // first
shared_ptr<C<T>>& rP; // second
};
Члены всегда будут инициализированы в порядке объявления. Это общий источник ошибок, когда один заканчивается в зависимости от другого, который еще имеет неопределенное значение. Предупреждение пытается помочь вам предотвратить это. Хотя это не проблема в вашем конкретном случае, потому что члены не зависят от порядка инициализации друг друга.
Других решений пока нет …