gpt4 book ai didi

c++ - 使用基类的注入(inject)类名进行限定依赖名称查找

转载 作者:行者123 更新时间:2023-12-01 14:25:16 24 4
gpt4 key购买 nike

最新版本的 clang、gcc 和 msvc (/permissive-) 都拒绝以下代码:

struct B {
void func() {}
};

template<typename T>
struct Base : B {
void func() {}
};

template<typename T>
struct Derived : Base<T> {
void func() {
this->Base::func(); // (*) fails here, even though this->B::func(); works
}
};

// for msvc, use /permissive- and the following instantiation for the error to trigger:
int main() {
Derived<void> d;
d.func();
}

根据 https://eel.is/c++draft/temp#dep.type-6.3,我对当前标准的理解是 (*) 被视为未知特化的成员 ,因此,名称解析将延迟到模板实例化,但鉴于 (*) 也是一个合格的函数调用,即使它是依赖的,也应该在基类中执行查找,然后它应该找到注入(inject)类-名称:基地

这段代码真的无效还是编译器错误?我错过了什么?

最佳答案

在类成员访问表达式this->Base::func中,id-expression是Base::func。在此表达式中,Base 不是未知特化的成员。

如果你想让它成为未知特化的成员,你必须用注入(inject)的类名来限定它:

template<typename T>
struct Derived : Base<T> {
void func() {
this->Derived::Base::func(); // compiles: Base is now a member of an unknown specialization
}
};

关于c++ - 使用基类的注入(inject)类名进行限定依赖名称查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62324397/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com