Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.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
为什么';是否允许派生类调用受保护的基函数? 模板 结构B { 受保护的: void f(){} }; 样板 结构A:B { () { 这个->f();//好的 f();//错误:使用了未声明的标识符“f” } }; int main() { A A; } 我的C++编译器是CLAN 3.8。 为什么CLAN不允许派生类调用受保护的基函数?< /p> < P>这对CLAN,但C++访问控制和保护< /COD>访问说明符,没有什么特别的作用。_C++_Templates_Compiler Errors_Clang - Fatal编程技术网

为什么';是否允许派生类调用受保护的基函数? 模板 结构B { 受保护的: void f(){} }; 样板 结构A:B { () { 这个->f();//好的 f();//错误:使用了未声明的标识符“f” } }; int main() { A A; } 我的C++编译器是CLAN 3.8。 为什么CLAN不允许派生类调用受保护的基函数?< /p> < P>这对CLAN,但C++访问控制和保护< /COD>访问说明符,没有什么特别的作用。

为什么';是否允许派生类调用受保护的基函数? 模板 结构B { 受保护的: void f(){} }; 样板 结构A:B { () { 这个->f();//好的 f();//错误:使用了未声明的标识符“f” } }; int main() { A A; } 我的C++编译器是CLAN 3.8。 为什么CLAN不允许派生类调用受保护的基函数?< /p> < P>这对CLAN,但C++访问控制和保护< /COD>访问说明符,没有什么特别的作用。,c++,templates,compiler-errors,clang,C++,Templates,Compiler Errors,Clang,语言规范希望确保您正在访问属于派生类对象的某个基子对象的受保护成员。您不应该能够访问一些基本类型的无关独立对象的受保护成员 因此,您必须通过pointer->member语法、reference.member或object.member语法访问受保护的成员,其中指针/引用/对象引用派生类 这与您在示例中显示的内容完全一致: template<int N> struct B { protected: void f() {} }; template<int N>

语言规范希望确保您正在访问属于派生类对象的某个基子对象的受保护成员。您不应该能够访问一些基本类型的无关独立对象的受保护成员

因此,您必须通过
pointer->member
语法、
reference.member
object.member
语法访问受保护的成员,其中指针/引用/对象引用派生类

这与您在示例中显示的内容完全一致:

template<int N>
struct B
{
protected:
    void f() {} 
};

template<int N>
struct A : B<N> 
{
    A()
    {
        this->f(); // ok
        f(); // error : use of undeclared identifier 'f'
    }
};

int main()
{
    A<8> a;
}
模板
结构B
{
受保护的:
void f(){}
};
样板
结构A:B
{
()
{
这个->f();//好的
f();//错误:使用了未声明的标识符“f”
}
};

受保护的成员不像私有成员那样私有,私有成员只能被声明它们的类的成员访问,但是它们不像公共成员那样公共,公共成员可以在任何函数中访问


派生类中的好友和成员函数只能通过指向派生类的指针、引用或对象来访问未声明为静态的受保护成员。

使用
B::f()
,这不是特定于clang的。
this->f()
B::f()
受保护的成员不像私有成员那样私有,私有成员只能被声明它们的类的成员访问,但是它们不像公共成员那样公共,而公共成员可以在任何函数中访问。派生类中的好友和成员函数只能通过指向派生类的指针、引用或对象来访问未声明为静态的受保护成员;如果
f()
是公共的,同样的问题也会出现。这是关于名称查找,而不是访问控制。仅供参考,如果将
protected
更改为
public
,代码将无法编译。我将此标记为非答案,可以通过重复的问题找到答案。@Danh虽然问题在别处得到了回答,但这并不意味着这是一个答案。这个答案是完全正确的(无论正确与否,我都不知道——这不是我的专业知识),并且没有剽窃关于重复问题的现有答案。请不要仅仅因为回答者不知道之前的所有其他39528191问题和答案就竖起假旗。
template<int N>
struct B
{
protected:
    void f() {} 
};

template<int N>
struct A : B<N> 
{
    A()
    {
        this->f(); // ok
        f(); // error : use of undeclared identifier 'f'
    }
};