繁体   English   中英

无法编译以下代码以访问struct的变体

cannot compile below code for visiting a variant of struct

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我尝试如下编写一个非常简单的变体和访问者实现,但遇到编译错误,无法弄清原因。

#include <variant>
#include <string>
#include <iostream>

struct foo
{
    std::string s;
};

struct bar
{
    double s;
};

using var = std::variant<foo, bar>;

struct visitor
{
    template <class T>
    auto operator()(const T v) -> decltype(v.s)
    {
        return v.s;
    }
};

int main()
{
    foo f;
    f.s = 3.0;

    var x = f;
    auto xs = std::visit(visitor{}, x);
    std::cout<<xs<<std::endl;
}

错误是如此之长,而且非常复杂,足以使我成为c ++ 11 +的新手。

In file included from main.cpp:1:
/usr/local/include/c++/8.1.0/variant: In instantiation of 'static constexpr auto std::__detail::__variant::__gen_vtable_impl<std::__detail::__variant::_Multi_array<_Result_type (*)(_Visitor, _Variants ...)>, std::tuple<_Rest ...>, std::integer_sequence<long unsigned int, __indices ...> >::_S_apply() [with _Result_type = std::__cxx11::basic_string<char> _Visitor = visitor&&; _Variants = {std::variant<foo, bar>&}; long unsigned int ...__indices = {1}]':
/usr/local/include/c++/8.1.0/variant:825:61:   required from 'static constexpr void std::__detail::__variant::__gen_vtable_impl<std::__detail::__variant::_Multi_array<_Result_type (*)(_Visitor, _Variants ...), __dimensions ...>, std::tuple<_Variants ...>, std::integer_sequence<long unsigned int, __indices ...> >::_S_apply_single_alt(_Tp&) [with long unsigned int __index = 1; _Tp = std::__detail::__variant::_Multi_array<std::__cxx11::basic_string<char> (*)(visitor&&, std::variant<foo, bar>&)> _Result_type = std::__cxx11::basic_string<char> _Visitor = visitor&&; long unsigned int ...__dimensions = {2}; _Variants = {std::variant<foo, bar>&}; long unsigned int ...__indices = {}]'
/usr/local/include/c++/8.1.0/variant:813:39:   required from 'static constexpr void std::__detail::__variant::__gen_vtable_impl<std::__detail::__variant::_Multi_array<_Result_type (*)(_Visitor, _Variants ...), __dimensions ...>, std::tuple<_Variants ...>, std::integer_sequence<long unsigned int, __indices ...> >::_S_apply_all_alts(std::__detail::__variant::__gen_vtable_impl<std::__detail::__variant::_Multi_array<_Result_type (*)(_Visitor, _Variants ...), __dimensions ...>, std::tuple<_Variants ...>, std::integer_sequence<long unsigned int, __indices ...> >::_Array_type&, std::index_sequence<__indices ...>) [with long unsigned int ...__var_indices = {0, 1}; _Result_type = std::__cxx11::basic_string<char> _Visitor = visitor&&; long unsigned int ...__dimensions = {2}; _Variants = {std::variant<foo, bar>&}; long unsigned int ...__indices = {}; std::__detail::__variant::__gen_vtable_impl<std::__detail::__variant::_Multi_array<_Result_type (*)(_Visitor, _Variants ...), __dimensions ...>, std::tuple<_Variants ...>, std::integer_sequence<long unsigned int, __indices ...> >::_Array_type = std::__detail::__variant::_Multi_array<std::__cxx11::basic_string<char> (*)(visitor&&, std::variant<foo, bar>&), 2> std::index_sequence<__indices ...> = std::integer_sequence<long unsigned int, 0, 1>]'
/usr/local/include/c++/8.1.0/variant:803:19:   required from 'static constexpr std::__detail::__variant::__gen_vtable_impl<std::__detail::__variant::_Multi_array<_Result_type (*)(_Visitor, _Variants ...), __dimensions ...>, std::tuple<_Variants ...>, std::integer_sequence<long unsigned int, __indices ...> >::_Array_type std::__detail::__variant::__gen_vtable_impl<std::__detail::__variant::_Multi_array<_Result_type (*)(_Visitor, _Variants ...), __dimensions ...>, std::tuple<_Variants ...>, std::integer_sequence<long unsigned int, __indices ...> >::_S_apply() [with _Result_type = std::__cxx11::basic_string<char> _Visitor = visitor&&; long unsigned int ...__dimensions = {2}; _Variants = {std::variant<foo, bar>&}; long unsigned int ...__indices = {}; std::__detail::__variant::__gen_vtable_impl<std::__detail::__variant::_Multi_array<_Result_type (*)(_Visitor, _Variants ...), __dimensions ...>, std::tuple<_Variants ...>, std::integer_sequence<long unsigned int, __indices ...> >::_Array_type = std::__detail::__variant::_Multi_array<std::__cxx11::basic_string<char> (*)(visitor&&, std::variant<foo, bar>&), 2>]'
/usr/local/include/c++/8.1.0/variant:863:38:   required from 'static constexpr std::__detail::__variant::__gen_vtable<_Result_type, _Visitor, _Variants>::_Array_type std::__detail::__variant::__gen_vtable<_Result_type, _Visitor, _Variants>::_S_apply() [with _Result_type = std::__cxx11::basic_string<char> _Visitor = visitor&&; _Variants = {std::variant<foo, bar>&}; std::__detail::__variant::__gen_vtable<_Result_type, _Visitor, _Variants>::_Array_type = std::__detail::__variant::_Multi_array<std::__cxx11::basic_string<char> (*)(visitor&&, std::variant<foo, bar>&), 2>]'
/usr/local/include/c++/8.1.0/variant:866:49:   required from 'constexpr const std::__detail::__variant::_Multi_array<std::__cxx11::basic_string<char> (*)(visitor&&, std::variant<foo, bar>&), 2> std::__detail::__variant::__gen_vtable<std::__cxx11::basic_string<char>, visitor&&, std::variant<foo, bar>&>::_S_vtable'
/usr/local/include/c++/8.1.0/variant:866:29:   required from 'struct std::__detail::__variant::__gen_vtable<std::__cxx11::basic_string<char>, visitor&&, std::variant<foo, bar>&>'
/usr/local/include/c++/8.1.0/variant:1394:23:   required from 'constexpr decltype(auto) std::visit(_Visitor&&, _Variants&& ...) [with _Visitor = visitor; _Variants = {std::variant<foo, bar>&}]'
main.cpp:34:38:   required from here
/usr/local/include/c++/8.1.0/variant:848:43: error: invalid conversion from 'std::__success_type<double>::type (*)(visitor&&, std::variant<foo, bar>&)' {aka 'double (*)(visitor&&, std::variant<foo, bar>&)'} to 'std::__cxx11::basic_string<char> (*)(visitor&&, std::variant<foo, bar>&)' [-fpermissive]
       { return _Array_type{&__visit_invoke}; }
1 个回复

std :: visit要求返回组合的返回类型必须是相同的类型和值类别:

从返回的表达式推断出返回类型,就像通过decltype一样。 对于所有变体的替代类型的所有组合,如果上面的调用不是相同类型和值类别的有效表达式,则调用格式错误。

参见C ++草案标准[variant.visit] p2

要求:对于每个有效包m,e(m)应为有效表达式。 所有这些表达式应具有相同的类型和值类别; 否则,程序格式不正确。

例如,如果每个结构都具有一个int成员x,而您返回该成员,则它将不再是格式错误的,只要看到它位于godbolt上即可 在您的情况下,您可以将访问者更改为仅打印而不是返回值以实时查看它

struct visitor
{
    template <class T>
    void operator()(const T v) 
    {
        std::cout<< v.s;
    }
};
4 如何为访问用户随机分配变体?

作为我的项目的一部分,我有四个变体(网页),我想随机地(均匀地)分配给访问的用户(可能基于访问者的IP)。 假设我有120位访问者访问我的网站,我想将它们平均分配到可用的四个变体中(每个30个访问者)。 不一定是准确的。 我们还可以假设不会有任何回头用户。 我正在使用Ubuntu LAM ...

2015-01-25 17:54:25 0 42   php/ lamp
6 无法编译代码

当我尝试使用intellij或简单的命令提示符编译它时,它告诉我:错误,无法找到或加载主类testing.java。 其他所有东西看起来都很完美(IDE中的任何地方都没有错误,也没有其他任何我能说出来的错误。运行“java testing.java”也不起作用并产生相同的错误。 任何帮 ...

2016-10-06 06:51:53 0 43   java
7 C:下面的代码不能编译?

我有K&R书,但是有些代码无法编译! 它给我-19 C:\\ Users \\ Nom \\ Desktop \\ Untitled1.c分配中的无效左值 编辑:现在可以用了,谢谢大家,但是现在什么也没做! printf语句不起作用。 它将打开dos控制台,我键入任何内容,仅 ...

2010-12-31 21:35:32 2 143   c
10 前往超级市场的​​伪代码

我一直在尝试编写功能性的伪代码来访问许多提供以下信息的超市: 超市数量 要收集的成分数量 成分状况良好的可能性 成分处于可接受状态的概率 价格 预算 我的初始方法是调整最近的伪代码,尽管以下预期结果使我难以进行: 查找要参观的超 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM