微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

std::variant 因模板化类失败

如何解决std::variant 因模板化类失败

我正在使用 std::variant 但是我似乎无法让它工作。当我使用 C++ 的原始类型时它工作正常,但如果我使用模板化类,我会收到以下编译器错误。有很多我无法理解的错误。这是构建输出。我不知道这有多少用处。

1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.28.29333\include\variant(1521,32): error C2672: 'invoke': no matching overloaded function found
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.28.29333\include\variant(1531): message : see reference to class template instantiation 'std::_Variant_single_visit_result<_Callable,std::integer_sequence<_Ty,5>,std::variant<int,char,bool,std::string,A<int>> &>' being compiled
1>        with
1>        [
1>            _Callable=EventVisitor,1>            _Ty=size_t
1>        ]
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.28.29333\include\variant(1654): message : see reference to class template instantiation 'std::_Variant_all_visit_results_same<_Callable,_listofIndexVectors,A<int>> &>' being compiled
1>        with
1>        [
1>            _Callable=EventVisitor
1>        ]
1>C:\Users\jaden\source\repos\Project8\Project8\Main.cpp(55): message : see reference to function template instantiation 'void std::visit<EventVisitor,A<int>>&,void>(_Callable &&,A<int>> &)' being compiled
1>        with
1>        [
1>            _Callable=EventVisitor
1>        ]
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.28.29333\include\variant(1522,1): error C2893: Failed to specialize function template 'unkNown-type std::invoke(_Callable &&,_Ty1 &&,_Types2 &&...) noexcept(<expr>)'
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.28.29333\include\type_traits(1588): message : see declaration of 'std::invoke'
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.28.29333\include\variant(1522,1): message : With the following template arguments:
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.28.29333\include\variant(1522,1): message : '_Callable=_Callable'
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.28.29333\include\variant(1522,1): message : '_Ty1=_First &'
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.28.29333\include\variant(1522,1): message : '_Types2={}'
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.28.29333\include\variant(1522,1): error C2780: 'unkNown-type std::invoke(_Callable &&) noexcept(<expr>)': expects 1 arguments - 2 provided
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.28.29333\include\type_traits(1582): message : see declaration of 'std::invoke'
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.28.29333\include\variant(1531,36): error C2955: 'std::_All_same': use of class template requires template argument list
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.28.29333\include\variant(40): message : see declaration of 'std::_All_same'
1>Done building project "Project8.vcxproj" -- Failed.
========== Build: 0 succeeded,1 Failed,0 up-to-date,0 skipped ==========

这是代码

#include <iostream>
#include <vector>
#include <variant>

template<class T>
class A
{
public:
    T t;
};

struct EventVisitor
{
    void operator()(std::string s)
    {
        std::cout << s << std::endl;
    }
    void operator()(int i)
    {
        std::cout << i << std::endl;
    }
    void operator()(char c)
    {
        std::cout << c << std::endl;
    }
    void operator()(bool b)
    {
        if (b)
        {
            std::cout << "True" << std::endl;
        }
        else
        {
            std::cout << "False" << std::endl;
        }
    }
};

int main()
{
    // std::variant<int,std::string> myVariant; works but if I add A<int> it breaks
    std::variant<int,A<int>> myVariant;

    myVariant = true;
    std::visit(EventVisitor{},myVariant);
}

解决方法

编译 std::visit 失败,因为您的访问者没有 A<int> 的处理程序。你必须添加它:

void operator()(A<int> t) {}

或者为您的访问者添加一个模板函数来处理您可能想要使用的所有类型。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。