Зачем нужна декларация об использовании именования конструктора?

Оба параграфа, 7.3.3.p1 и p3, в Стандарте C ++ 11, ссылаются на используя декларирование называя конструктор. Почему это необходимо? Код ниже показывает, что базовый класс Aконструкторы видны в производном классе B как и ожидалось.

class A
{
int i;

public:
A() : i(0) {}
A(int i) : i(i) {}
};

class B : public A
{
public:
//  using A::A;
A f1() { return A(); }
A f2() { return A(1); }
};

int main()
{
B b;
A a1 = b.f1();
A a2 = b.f2();
}

Если я закомментирую using A::A; выше ничего не меняется в исполнении программы.

0

Решение

Это предназначено для наследования не по умолчанию конструкторы из родительского класса, который является A(int i) в этом случае. Измените свою декларацию в основном так:

int main()
{
B b(42);  // Want to forward this to A::A(int)
...
}

Без using A::A предложение, вы получите следующую ошибку компилятора (по крайней мере из g ++ 4.8.0):

co.cpp: In function ‘int main()’:
co.cpp:20:11: error: no matching function for call to ‘B::B(int)’
B b(42);
^
co.cpp:20:11: note: candidates are:
co.cpp:10:7: note: B::B()
class B : public A
^
co.cpp:10:7: note:   candidate expects 0 arguments, 1 provided
co.cpp:10:7: note: constexpr B::B(const B&)
co.cpp:10:7: note:   no known conversion for argument 1 from ‘int’ to ‘const B&’
co.cpp:10:7: note: constexpr B::B(B&&)
co.cpp:10:7: note:   no known conversion for argument 1 from ‘int’ to ‘B&&’

но если вы добавите using A::A декларация обратно, она компилируется чисто. b(42) в итоге звонит A::A(int i),

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]