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

容器初始化模板类型推导:带默认参数的类能否直接作为vector模板实参

报错原因

integer是类模板名,本身不是可直接使用的完整类型,只有完成实例化的integer<Int>才是合法类型。你写integer num;能通过编译是依赖C++17的类模板实参推导(CTAD)特性,该特性仅支持变量声明场景的自动推导,无法直接在模板参数填写的场景下自动推导默认实参。


不编写std::vector<integer<int>>的修复方案

  • 方案1:直接使用空尖括号触发默认模板参数
    仅需给integer加空尖括号即可调用你设置的默认int参数,修改后代码可直接编译:
#include<vector>

template <typename Int = int>
struct integer{
    Int i;
};

int main(){
    integer num;
    std::vector<integer<>> vec;
    return 0;
}
  • 方案2:定义类型别名省略尖括号
    你可以在模板定义后新增一行类型别名,之后所有场景都可以直接使用不带尖括号的integer:
template <typename Int = int>
struct integer{
    Int i;
};
using integer = integer<int>; // 新增别名

int main(){
    integer num;
    std::vector<integer> vec; // 完全不用写尖括号
    return 0;
}
  • 方案3:利用CTAD自动推导vector元素类型
    如果你的vector在声明时有初始化的元素值,编译器可以自动推导vector的模板参数,不需要手动填写:
int main(){
    std::vector vec{integer{1}, integer{2}}; // 自动推导为std::vector<integer<int>>
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 15:06:04