Почему компилятор выбирает конструктор базового класса в списке аргументов шаблона?
Дополнительный вопрос кэтот.
В основном, в следующем коде, почему компилятор считает, чтоB
внутриA<B>
вC
s конструктор ссылается на (недоступный) конструкторB
базовый класс?
struct B{};
template <typename T>
struct A : private T{};
struct C : public A<B>{
C(A<B>); // ERROR HERE
};
Живой пример на Ideone. Выход:
prog.cpp: 1: 9: ошибка: «struct B B :: B» недоступна
prog.cpp: 7: 7: ошибка: в этом контексте
Обратите внимание, что та же ошибка появляется, если вы измените аргумент конструктора наA<B*>
, A<B&>
или дажеA<const B>
, Также обратите внимание, что три из MSVC10, GCC 4.7 и Clang 3.1 ToT будут давать ошибку, поэтому это должно быть что-то в спецификации C ++.Что это такое?