boost::变体访问者返回错误(最麻烦的解析?)
boost::variant visitor return error (most vexing parse?)
我有一个boost::variant
对象的std::array
,我正试图创建一个访问数组中某个元素的boost::static_visitor
,返回对每个变体成员类型中某个内容的引用。这很难理解,所以这里有一个模仿我的实现的代码片段:
#include <boost/variant.hpp>
#include <array>
struct SomeType {};
struct A {
SomeType something;
SomeType& someMethod() { return something; }
};
struct B {
SomeType something;
SomeType& someMethod() { return something; }
};
struct C {
SomeType something;
SomeType& someMethod() { return something; }
};
typedef boost::variant<A, B, C> MyVariant;
class SomeVisitor : public boost::static_visitor<> {
public:
template<typename T>
SomeType& operator()(T& operand) const {
return operand.someMethod();
}
};
class MyVariants {
public:
SomeType* getSomething(unsigned index);
private:
static const size_t count = 100;
std::array<MyVariant, count> variants_;
};
SomeType* MyVariants::getSomething(unsigned index) {
if(index < count) {
MyVariant& variant = variants_[index];
SomeType& something = boost::apply_visitor(SomeVisitor(), variant);
return &something;
}
else {
return nullptr;
}
}
这个代码段使用clang 3.6.2编译,但gcc 5.3.1抛出了以下内容(后面是来自boost变体标头的几十个错误)
test.cpp:43:47: error: invalid initialization of non-const reference of type 'SomeType&' from an rvalue of type 'boost::static_visitor<>::result_type {aka void}'
SomeType& something = boost::apply_visitor(SomeVisitor(), variant);
所有的错误似乎都说明了同样的事情——访问者的返回类型是void
,我无法将其绑定到SomeType&
。我认为SomeVisitor
的实现没有任何语法错误,因为它可以用clang编译得很好。
这个问题和这个问题显示了boost::static_visitor
生成的类似错误,并且都用C++最麻烦的解析来解释。在这两个问题中,问题是这样的(使用我上面片段中的类型):
MyVariant variant(A());
SomeType& something = boost::apply_visitor(SomeVisitor(), variant);
在这种情况下,我可以理解最麻烦的解析是如何应用的。MyVariant variant(A());
对编译器来说可能是不明确的。不过,我不知道这是如何应用于我的代码片段的,因为MyVariant& variant = variants_[index]
看起来相当明确。我不知道这些问题是否与我的问题有关。
任何建议/帮助都将不胜感激
作为答案提供的注释:
您必须在static_cvisitor的模板参数列表中指定返回类型。将其留空就是告诉编译器函子将返回void。
class SomeVisitor : public boost::static_visitor<SomeType&> {
public:
template<typename T>
SomeType& operator()(T& operand) const {
return operand.someMethod();
}
};
或者,在使用c++14的boost的后续版本中:
auto& something = boost::apply_visitor([](auto& x) { return x.someMethod(); },
variant);
相关文章:
- 访问者访问变体并返回不同类型时出错
- 我已经阅读了很多关于 2d 数组的信息,但我在作业中使用它时遇到了麻烦
- 查找奇数平方和时遇到麻烦
- 使用自定义访问者时具有自定义类型的提升变体失败(源自 boost::static_visitor)
- 将双倍转换为 LPARAM 的麻烦
- 麻烦得到提升::记录器编译
- 翻转 ppm 图像C++麻烦
- 对于参加可复制和可移动类的访问者来说,应该有多少过载?
- 尝试使用 indexOf 创建一个 if 语句来检查字符串是否包含字符.有一点麻烦
- 搬家turtlebot_gazebo麻烦
- CSUF EPP - 你有什么想法(在添加到链接列表末尾时遇到麻烦)
- 我的期末考试遇到了麻烦.代码不断循环回到我的订购菜单,不会显示我的总价
- 作为一个C++新手,我遇到了麻烦
- 添加调试设施以提升变体访问者
- 我需要帮助创建一个评分系统,但它一直给我一个错误,注释掉的整数是给我带来麻烦的部分
- 找麻木的麻烦
- 如何使更安全的C++变体访问者,类似于切换语句?
- 使用访问者模式检查派生类类型?
- MySQL 从注入过渡到参数化时遇到麻烦
- boost::变体访问者返回错误(最麻烦的解析?)