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_tuint32_t 进行隐式转换。因此,没有最佳重载,赋值/初始化无法编译。

强制输入:

my_int = static_cast<int32_t>(int16_t_value);

【讨论】:

我会澄清这个问题,但我并不特别关心将 int16_t 转换为 uint16_t。我正在分配一个不在变体中的类型(即任何不是 uintXX_t 的) 你还没到那个时候。即使有“澄清”的问题。将虚假值分配给变体有什么问题?你为什么期望它编译?它应该怎么做?您在寻找boost::any 吗? (如果是这样 - 这是 99% 的设计气味,那么:为什么?)

以上是关于C++ Boost 变体错误的主要内容,如果未能解决你的问题,请参考以下文章

Boost mpl::list 变体序列化 check_const_loading() 编译错误

Boost:创建一个返回变体的函数

为递归变体编写 boost::variant 访问者

C++ 简单变体增强

编译 boost c++ 代码错误

C++ 11 Boost 1.65 recursive_directory_iterator 给出分段错误错误