2015-04-06 3 views
4

Я искал это, и я удивлен, что ничего не нашел. Почему я не могу наследовать конструктор базового класса с использованием объявления using и добавить перегрузку в производном классе? Я использую Visual C++ 2013, конструктор базового класса игнорируется, если по умолчанию, построения b:Inherit and overload default constructor

error C2512: 'B' : no appropriate default constructor available 

Я имел дело с этим путем повторного определения конструкторов, но мне не нравится это. Это всего лишь минимальный пример, это не беспокоило бы меня, если бы у меня был только один конструктор базового класса.

struct A 
{ 
    A() : a(10) {} 

    int a; 
}; 

struct B : A 
{ 
    using A::A; 

    explicit B(int a) { this->a = a; } 
}; 

int main() 
{ 
    B b; 
} 
+0

Это правильный код. См. Http://stackoverflow.com/questions/9979194/what-is-constructor-inheritance. –

+1

@RSahu Это было бы правильно без другого конструктора в 'B'. – 0x499602D2

+0

@ 0x499602D2, это было бы глупо - не позволять 'B' добавлять больше конструкторов только потому, что наследует конструкторы от' A'. –

ответ

9

Проблема в том, что конструкторы по умолчанию не наследуются. Из [class.inhctor]/р3:

Для каждого конструктора нешаблонного в наборе кандидатов унаследованных конструкторов [..], конструктор неявно объявляются с теми же характеристиками конструктора если нет пользователя -declared конструктор с той же сигнатурой в полном классе, где появляется объявление using, или конструктор будет по умолчанию, копирует или перемещает конструктор для этого класса.

У вас также есть конструктор, объявленный пользователем, который подавляет создание неявного конструктора по умолчанию. Просто добавьте дефолт, чтобы он работал:

B() = default;