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

Это мой фрагмент:

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 );

это просто отлично работает.

Кажется, что любая функция, требующая только дешевого приведения, даже если она искажена, скрывает неявные, но дорогие приведения. У кого-нибудь есть подсказка?

5

Решение

Обновлено, благодаря @ T.C.

WrapperCtor является шаблон определяемое пользователем преобразование, следовательно нешаблонном стандартная последовательность преобразования перегрузка с Base& имеет приоритет. Проверка доступа выполняется только после Выбор перегрузки — что слишком поздно в вашем случае.

Полные правила сложны, больше можно найти Вот, посмотрите в разделе «Лучшая жизнеспособная функция».

5

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


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