You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Clang无法识别类型别名引入的基类构造函数及语法差异问题

C++中基类构造函数using声明的编译器差异问题

这段代码可被多个版本的GCC接受,但被多个版本的Clang拒绝:

struct ACS{};

template<typename Dep>
struct AD{};

template<typename Der, typename Dep>
struct PA{
    explicit PA(ACS&) {}
};

template<typename AT, typename ADep>
struct AA : public PA< AA<AT, ADep>, AD<ADep> >
{
    using base = PA< AA<AT, ADep>, AD<ADep> >;
    using base::PA;
    // accepted by both: using base::base;
};

int main()
{
    ACS acs;
    AA<int, double> aa{acs};
}

Clang给出的错误提示为:

:15:17: error: dependent using declaration resolved to type without 'typename' using base::PA; ^

显然Clang期望使用typename关键字,但错误提示建议的写法using base:: typename PA;毫无意义,且会被两个编译器拒绝。而更合理的using typename base::base;虽无语法错误,但Clang仍提示无匹配构造函数。

对比之下,using base::base可被两个编译器接受,即使不加typename;但using typename base::base仅被GCC支持,Clang会报错:

:18:27: error: typename is allowed for identifiers only using typename base::base; ~~~~~~~~~ ^

为何using base::PA与using base::base存在差异?base不是PA的别名吗?

内容的提问来源于stack exchange,提问作者Bulletmagnet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 11:08:25