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

可变参数模板类成员函数默认模板模板参数为自身是否合法?

模板模板参数默认值的编译器兼容性问题

以下代码可在clang++ 10.0中编译通过,但在g++ 12.2中无法编译,哪种编译器的行为符合C++标准?

template<typename... T>
struct V{
  template<template<typename...> class U=V, typename T2>
  static void foo(T2){}
};

int main(){ 
  V<int>::foo(0);
}

更新说明

正如评论指出,最新版本的GCC已可编译此代码。同时存在一个适用于旧版GCC的简单解决方案:创建别名模板,代码如下:

template<typename... T>
struct V{

  template<typename ... TT> 
  using vars = V<TT...>;

  template<template<typename...> class U=vars, typename T2>
  static void foo(T2){}
};

int main(){ 
  V<int>::foo(0);
}

需要注意的是,此问题与其他类似问题不同——它是GCC 13.0版本之前存在的bug,仅在将类作为成员函数的模板模板参数默认值时触发,类名注入在其他场景下可正常工作,上述解决方案也能证明这一点。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 18:39:55