【发布时间】:2023-04-09 14:52:01
【问题描述】:
我一直在玩 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 编译器,但它并没有指出我的主要功能错误。我今天可以尝试一下。
-
如果您的问题是关于可读错误消息的,您无能为力。只需分配正确的值。赋值失败的事实应该很明显地表明该值不是明确可转换的。