这是我的片段:
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是模板用户定义的转换,因此 non-template 标准转换序列用Base&
超载优先。选择过载后仅执行访问检查 - 在您的情况下为时已晚。
完整的规则很复杂,可以在此处找到更多,请查看"最佳可行函数"部分。