aschepler дает ответ, но я хотел объяснить, что приводит к этой проблеме, и показать «лучшие практики» для делегирования конструкторов, чтобы избежать этого.
В вашем коде у вас есть серия конструкторов, каждая из которых более общая, чем конструктор, которому они делегируют. То есть вы пытаетесь передать делегат конструктора более специализированному конструктору, который не делает все, а затем вы выполняете небольшую работу, чтобы справиться с дополнительной общностью. Это отступает от того, что оказалось самым практичным способом построения делегации на более ранних языках, которые ее поддерживают.
Вместо этого нужно, чтобы самым общим конструктором был «корень» делегирования («назначенный инициализатор» или «назначенный конструктор», на других языках). Более специализированные конструкторы будут выполнять свою работу с использованием более общих конструкторов, передавая им данные для обработки специального случая.
В вашем случае специализированное поведение заключается в использовании значений по умолчанию для некоторых членов вместо того, чтобы принимать начальные значения от пользователя. Поэтому ваши более специализированные конструкторы будут выполнять свою работу, передав параметр, который они заданы вместе со значениями по умолчанию для других членов.
template<typename T>
struct A
{
typedef std::vector<T> type1;
type1 a;
type1 b;
type1 c;
A(type1 i_a, type1 i_b, type1 i_c): a(i_a), b(i_b), c(i_c) {}
A(type1 i_a, type1 i_b): A(i_a, i_b, {}) {}
A(type1 i_a): A(i_a, {}) {}
};
Какой компилятор и опции? Похоже, вы не используете C++ 11, даже если вы намеревались. –
Возможно, ваш компилятор не поддерживает делегирование конструкторов. Какой компилятор и версия вы используете? – juanchopanza
Я использую 'g ++ -std = C++ 0x', если это то, что вы имеете в виду? И версия 4.6 – user592748