C++ 友元结构继承类时不可访问
我想隐藏基类并限制可以从基类继承的类:C++ 友元结构继承类时不可访问,c++,inheritance,visual-c++,friend,access-control,C++,Inheritance,Visual C++,Friend,Access Control,我想隐藏基类并限制可以从基类继承的类: namespace _detail { class Private abstract final { struct Base abstract { protected: Base() {} }; friend struct ::A; friend struct ::B; friend struct ::C; }; }
namespace _detail {
class Private abstract final {
struct Base abstract {
protected:
Base() {}
};
friend struct ::A;
friend struct ::B;
friend struct ::C;
};
}
struct A : _detail::Private::Base {}; //error
struct B : _detail::Private::Base {}; //error
struct C : _detail::Private::Base {}; //error
编译器告诉我,
\u detail::Private::Base
对A
、B
和C
是不可访问的,即使他们是Private
的朋友。我以前使用过这种模式,没有任何问题,与我使用过的其他模式相比,我看不出这里有什么不同。我没有看到什么?C++语言不允许在好友声明中使用限定名(如::A
),除非这些限定名引用以前声明的实体。实际上,这个规则在任何地方都被虚拟地应用,而不仅仅是在朋友声明中:限定名必须引用以前声明的实体
在本例中,您在友元声明中使用了限定名::A
,友元结构::A。要使其工作,编译器必须事先知道来自全局名称空间的struct A
。在您的例子中,A
没有在该点声明,这使得friend struct::A
声明格式不正确。它甚至不应该按照语言的正式规则进行编译
如果你的编译器接受了这一点,你必须查阅你的编译器文档来弄清楚它的意思。我怀疑未知的的友元结构::A
:A
被解释为等同于友元结构A
,即它声明\u detail::A
为友元
如果您进行正向声明
struct a
在声明名称空间\u detail
之前,它可能会使其按预期工作 C++语言不允许在好友声明中使用限定名(如::A
),除非这些限定名引用以前声明的实体。实际上,这个规则在任何地方都被虚拟地应用,而不仅仅是在朋友声明中:限定名必须引用以前声明的实体
在本例中,您在友元声明中使用了限定名::A
,友元结构::A。要使其工作,编译器必须事先知道来自全局名称空间的struct A
。在您的例子中,A
没有在该点声明,这使得friend struct::A
声明格式不正确。它甚至不应该按照语言的正式规则进行编译
如果你的编译器接受了这一点,你必须查阅你的编译器文档来弄清楚它的意思。我怀疑未知的的友元结构::A
:A
被解释为等同于友元结构A
,即它声明\u detail::A
为友元
如果您进行正向声明
struct a
在声明名称空间\u detail
之前,它可能会使其按预期工作 C++语言不允许在好友声明中使用限定名(如::A
),除非这些限定名引用以前声明的实体。实际上,这个规则在任何地方都被虚拟地应用,而不仅仅是在朋友声明中:限定名必须引用以前声明的实体
在本例中,您在友元声明中使用了限定名::A
,友元结构::A。要使其工作,编译器必须事先知道来自全局名称空间的struct A
。在您的例子中,A
没有在该点声明,这使得friend struct::A
声明格式不正确。它甚至不应该按照语言的正式规则进行编译
如果你的编译器接受了这一点,你必须查阅你的编译器文档来弄清楚它的意思。我怀疑未知的的友元结构::A
:A
被解释为等同于友元结构A
,即它声明\u detail::A
为友元
如果您进行正向声明
struct a
在声明名称空间\u detail
之前,它可能会使其按预期工作 C++语言不允许在好友声明中使用限定名(如::A
),除非这些限定名引用以前声明的实体。实际上,这个规则在任何地方都被虚拟地应用,而不仅仅是在朋友声明中:限定名必须引用以前声明的实体
在本例中,您在友元声明中使用了限定名::A
,友元结构::A。要使其工作,编译器必须事先知道来自全局名称空间的struct A
。在您的例子中,A
没有在该点声明,这使得friend struct::A
声明格式不正确。它甚至不应该按照语言的正式规则进行编译
如果你的编译器接受了这一点,你必须查阅你的编译器文档来弄清楚它的意思。我怀疑未知的的友元结构::A
:A
被解释为等同于友元结构A
,即它声明\u detail::A
为友元
如果您进行正向声明
struct a
在声明名称空间\u detail
之前,它可能会使其按预期工作 friend结构A
在命名空间\u detail
中将一个结构声明为friend@sftrabbit它可以工作,为什么不呢?@DyP抱歉忘了放::operator@sftrabbitVisualC++,现在需要向前声明。但是它应该工作(对于标准C++,忽略<代码>抽象<代码>)。<代码>朋友结构A;在命名空间\u detail
中将一个结构声明为friend@sftrabbit它可以工作,为什么不呢?@DyP抱歉忘了放::operator@sftrabbitVisualC++,现在需要向前声明。但是它应该工作(对于标准C++,忽略<代码>抽象<代码>)。<代码>朋友结构A;在命名空间\u detail
中将一个结构声明为friend@sftrabbit它可以工作,那么为什么不呢?@DyP sorry fo