模板中调用std::variant的emplace函数编译报错问题咨询
解决模板类中std::variant::emplace的编译错误
你遇到的这个编译错误,根源是C++模板的依赖名称解析规则,和std::variant::emplace本身的使用限制无关。
在你的模板类fsm中,StateVariant是模板参数,state.emplace<1>()里的emplace是依赖于StateVariant的成员模板函数。编译器在处理模板定义(还未实例化)的时候,无法确定emplace到底是一个模板函数还是普通的成员变量/函数,它会默认把<当作小于号来解析,自然就会报语法错误。
修正方法
只需要在emplace前加上template关键字,明确告诉编译器这是一个模板函数调用即可:
template <typename StateVariant> class fsm { public: StateVariant state; fsm() { // 加上template关键字指明emplace是模板函数 state.template emplace<1>(); }; }; struct Initial{}; struct Running{}; using State = std::variant<std::monostate,Initial,Running>; fsm<State> myFSM;
为什么非模板代码没问题?
在非模板代码中,myState的类型是具体的State(即std::variant<std::monostate,Initial,Running>),编译器可以直接确定emplace是std::variant的成员模板函数,不需要额外的template关键字来提示,所以调用myState.emplace<1>()是完全合法的。
补充说明
std::variant::emplace本身没有特殊的使用限制,它既可以通过索引(比如emplace<1>())也可以通过类型(比如emplace<Initial>())来构造指定的备选类型。只要在模板语境中正确处理依赖名称的解析,就能正常使用。
内容的提问来源于stack exchange,提问作者hreintke
相关产品推荐
相关产品推荐

