Это мой фрагмент:
class Base{};
class Derived : private Base{};
template<class T>
class Wrapper
{
public:
template<typename T2>
Wrapper( T2&& )
{ }
};
// Function declarations
void func( Base& param );
void func( Wrapper<Derived> );
void funcUnambiguous( Wrapper<Derived> );// Here is the Call:
Derived d = Derived();
func( d ); // <- Error
GCC 4.9 дает мне: error: 'Base' is an inaccessible base of 'Derived'
Тогда как я делаю
Derived d = Derived();
funcUnambiguous( d );
это просто отлично работает.
Кажется, что любая функция, требующая только дешевого приведения, даже если она искажена, скрывает неявные, но дорогие приведения. У кого-нибудь есть подсказка?
Обновлено, благодаря @ T.C.
Wrapper
Ctor является шаблон определяемое пользователем преобразование, следовательно нешаблонном стандартная последовательность преобразования перегрузка с Base&
имеет приоритет. Проверка доступа выполняется только после Выбор перегрузки — что слишком поздно в вашем случае.
Полные правила сложны, больше можно найти Вот, посмотрите в разделе «Лучшая жизнеспособная функция».