模板内是否必须指定typename?GCC与Clang编译差异解惑
GCC与Clang在模板默认参数中
typename要求的差异原因 你碰到的这个GCC和Clang的编译差异,本质是编译器对C++新特性的支持节奏不一样,咱们来捋清楚:
首先看你提供的代码片段:
template< typename T, typename value_type = T::value_type > void func(T t) {}
这段代码在GCC 10.0.1中能顺利编译通过,但用Clang编译时会报错:
❯ clang++ -std=c++20 asdf.cpp
asdf.cpp:3:27: error: missing 'typename' prior to dependent type name 'T::value_type'
typename value_type = T::value_type
^~~~~~~~~~~~~
typename
1 error generated.
差异的核心原因
这个区别的根源在于P0634R3这个C++标准提案——它允许在模板的默认参数里省略typename来指代依赖类型(像T::value_type这种依赖模板参数T的类型名)。GCC已经完成了这个特性的实现,所以能识别你的代码并正常编译;而Clang目前还没有支持这个特性,因此依然要求你显式添加typename来标记这类依赖类型。
更新补充
- 更新1:正如@Language Lawyer所说,相关的
typename省略特性正是来自P0634R3,目前Clang暂未支持该特性。 - 更新2:由于原问题包含两个主题,已将其拆分,详情可查看编辑历史。
内容的提问来源于stack exchange,提问作者PHD
相关产品推荐
相关产品推荐

