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

如何定义带有模板模板参数类型的引用型模板形参的C++类模板

适配GNU++11的实现方案

原代码的语法错误

非类型模板参数的标准格式为参数类型 参数名,你原本写的typename S<int I>::template & n完全不符合语法规则:

  • 在类类型位置嵌套了未绑定的非类型参数I,编译器无法解析依赖类型
  • 错误将引用修饰符放在类名和参数名之间,结构混乱

可直接编译运行的代码

纯标准C11不支持自动推导非类型模板参数绑定的对象类型,你使用的GNU编译器在C11模式下内置了对应扩展能力,可实现“仅传入一个对象引用就完成实例化”的目标,不需要额外拆分模板参数:

template<int I> struct S {
    int get() { return 42 + I; }
};

// GNU++11扩展支持auto作为非类型模板参数的类型占位
template<auto& n>
struct C {
    int get() {
        return n.get();
    }
};

S<42> s;

int main()
{
    C<s> c;
    return c.get();
}

运行逻辑

实例化C<s>时,编译器会自动把占位符auto&推导为S<42>&,将全局对象s的引用绑定到模板参数n上,调用n.get()的返回值为42 + 42 = 84,和预期效果完全一致。

注意:如果不使用GNU扩展,纯C++11标准要求必须显式写出非类型参数的完整类型,需要为C额外增加对应整型模板参数I,无法做到仅传对象引用单参数完成实例化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 12:15:11