Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 友元结构继承类时不可访问_C++_Inheritance_Visual C++_Friend_Access Control - Fatal编程技术网

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