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
相关产品推荐
相关产品推荐

