C++ Boost 变体错误
Posted
技术标签:
【中文标题】C++ Boost 变体错误【英文标题】:C++ Boost Variant Error 【发布时间】:2016-02-09 22:45:14 【问题描述】:我一直在玩 boost 变体,遇到了一个似乎有问题的场景,但我觉得我缺乏关于如何正确使用 boost 变体的知识。这是我整理的一个小测试程序
main.cpp
#include <boost/variant.hpp>
#include <iostream>
#include <stdint.h>
typedef boost::variant<uint16_t, uint32_t> MyInt;
int main()
uint16_t regular = 11;
MyInt custom = regular;
std::cout << custom << '\n';
return 0;
好的,上面的工作正常,但如果我尝试执行以下操作,我会收到错误:
int16_t invalid = 11;
MyInt custom = invalid; // This line causes the error.
我预计会收到一个错误,但该错误并没有告诉我我的问题实际发生在我的 main 中的哪里,而是在 Boost 的类中,这在处理更大的项目时并不是最有帮助的。
我开始研究提升访问者以将错误放在 main 中,但不太明白这些将如何解决我的问题。我是否与访客走在正确的轨道上,还是我错过了其他一些东西?
编辑:
这里真正的问题是对我的变体中未指定的任何类型(即 char、std::string、double 等)的无效赋值,而不是将 int16_t 转换为 uint16_t。
【问题讨论】:
这两行到底是在哪里添加的? (顺便说一句,你有一个名为 myInt 的 type-o) 使用其他编译器怎么样? Clang 3.7 为此代码提供了一些非常有用的错误消息。它还将错误的根源定位到MyInt custom = invalid; // This line causes the error.
行
MyInt 中没有错字,这是一个 typedef,我将用它们替换 main 中的前 2 行 @RichardHodges
@rettichschnidi 您认为这是编译器特定的东西吗?我正在使用 Visual Studio 编译器,但它并没有指出我的主要功能错误。我今天可以尝试一下。
如果您的问题是关于可读错误消息的,您无能为力。只需分配正确的值。赋值失败的事实应该很明显地表明该值不是明确可转换的。
【参考方案1】:
int16_t
需要对 uint16_t
和 uint32_t
进行隐式转换。因此,没有最佳重载,赋值/初始化无法编译。
强制输入:
my_int = static_cast<int32_t>(int16_t_value);
【讨论】:
我会澄清这个问题,但我并不特别关心将 int16_t 转换为 uint16_t。我正在分配一个不在变体中的类型(即任何不是 uintXX_t 的) 你还没到那个时候。即使有“澄清”的问题。将虚假值分配给变体有什么问题?你为什么期望它编译?它应该怎么做?您在寻找boost::any
吗? (如果是这样 - 这是 99% 的设计气味,那么:为什么?)以上是关于C++ Boost 变体错误的主要内容,如果未能解决你的问题,请参考以下文章