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

如何为自定义模板类正确使用std::variant?

关于std::variant结合自定义模板类的问题解答

问题代码

template<typename T>
class A
{
public:
    A(){};
    A(T value) : _value(value){};
public:
    T _value;
};

using variant_t = std::variant<A<std::string>, A<int>, A<bool>, A<double>, A<unsigned int>, A<unsigned short>>;

int main()
{
    std::unordered_map<std::string, variant_t> Foo;
    Foo = {{"name", A("name")}};
    return 0;
}

错误原因与解决方法

  • 模板参数推导失败:A("name")未明确指定模板参数,编译器无法自动推导它属于A<std::string>,进而无法匹配std::variant的备选类型列表。只需显式指定模板参数即可修复:
    Foo = {{"name", A<std::string>("name")}};
    
  • 迭代器相关编译错误:这是类型推导问题引发的连锁异常,并非std::unordered_map迭代器本身存在问题。解决第一个类型推导错误后,该错误会自动消失。
  • 关于std::variant初始化的疑问:std::variant不需要手动强制初始化某一种类型,它默认会初始化备选类型列表中第一个可默认构造的类型(你的代码中就是A<std::string>,因为A提供了默认构造函数)。你遇到的问题和是否必须初始化variant无关,核心是构造variant时传入的对象类型不明确,导致编译器无法匹配备选类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 01:50:28