当前位置: 首页 > 知识库问答 >
问题:

为什么在扩展模板参数时对访问说明符的处理不同?

堵才哲
2023-03-14

扩展问题“如果父类是模板,为什么禁止取消父类的成员?”。

Clang和GCC都抱怨B无法访问A::成员,因为它受到保护。

但是,B可以访问A::成员,如果B的特定实例被请求,它只是在B的扩展期间

在这种情况下,为什么忽略了B对A的公共继承?(如果是这样的话。)

template<typename T>
class A{
protected:
   int member;
public:
   using type_name = T;
};

template<typename T>
class B: public A<T>{
   decltype(A<T>::member) another_member;
};

template<typename T,
         typename P=typename T::type_name>
void foo(){}

// Force the instantiation of foo
void bar(){
    foo<B<int>>();
}

共有1个答案

麹高远
2023-03-14

他们不是。使用<代码>B

问题来自于,在decltype(member)中,编译器立即注意到成员不在范围内;然而,在decltype(A)中

因为<代码>B

 类似资料:
  • 问题内容: 在Java中, 访问说明符 和 访问修饰符 是一回事吗? 问题答案: “访问修饰符”是Java语言规范中的正式术语,并在Java语言规范中使用。“访问说明符”在Java API文档中 同义使用,但这是我第一次注意到这一点。最好坚持使用JLS术语。

  • 本文向大家介绍Java中受保护的访问说明符和默认的访问说明符有什么区别?,包括了Java中受保护的访问说明符和默认的访问说明符有什么区别?的使用技巧和注意事项,需要的朋友参考一下 受保护的 访问说明符是相同的封装内可见,并且还在子类中可见,而默认 为一个 包级别的访问specifie r和它可以在同一个包中可见。 受保护的访问说明符 受保护的 遗嘱在同一软件包中充当公共角色,而在软件包中充当私有角

  • 在里面https://github.com/stlab/libraries/blob/main/stlab/concurrency/main_executor.hpp,我读到 decltype(f)的意义是什么,为什么不直接使用f?

  • 问题内容: 我刚开始读一本Java书籍,就纳闷了。如果未指定,则哪个访问说明符是默认的? 问题答案: 默认可见性称为“ package-private”(尽管您不能显式使用此属性),这意味着可以从该类所属的同一包内部访问该字段。 正如mdma指出的那样,接口成员的情况并非如此,其默认值为“ public”。

  • Java说: 所以说数组是协变的。但对于泛型,他们说: 因此它是不变量。但问题是,“泛型真的不变吗?”? 例如,如果我给出: 这意味着列表可以采用异常的子类型,例如这是有效的: 那么为什么泛型被称为不变量呢?

  • 1.ConfigService扩展 1.1介绍 Zebra的ConfigsService是一个可扩展的配置加载接口,通过扩展ConfigService,用户可以自己定制配置获取的方式。 Zebra默认提供2种ConfigService,本地的PropertiesConfigService和ZookeeperConfigService。 package com.dianping.zebra.conf