如何为自定义模板类正确使用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
相关产品推荐
相关产品推荐

