C ++可选错误:constexpr std :: _ Optional_payload <_Tp,<anonymous>,<anonymous>> ...无法重载

问题描述

我正在尝试在模板中使用Optional,但是我在编译时遇到了错误

代码如下:

template<typename T>
std::optional<const Edge<T>&> Graph<T>::getEdge(unsigned long edgeId) const
{
    
    auto it = edgeSet.begin();
    for(it; it != edgeSet.end(); ++it){
        if(it->getId() == edgeId){
            return std::make_optional<const Edge<T>&>(*it);
        }
    }
    std::optional<const Edge<T>&> result;
    return result;
}

我有一个执行此工作的googletest:

ASSERT_FALSE(graph.getEdge(2).has_value());

它应该返回false并通过测试。 但是我的问题是在编译中。编译器给我这个错误:

In file included from /usr/include/c++/7/bits/node_handle.h:39:0,from /usr/include/c++/7/bits/stl_tree.h:72,from /usr/include/c++/7/map:60,from /usr/include/gtest/internal/gtest-internal.h:58,from /usr/include/gtest/gtest.h:58,from /home/codespace/workspace/CXXGraph/test/test1.cpp:1:
/usr/include/c++/7/optional: In instantiation of ‘struct std::_Optional_payload<const CXXGRAPH::Edge<int>&,true,true>’:
/usr/include/c++/7/optional:425:30:   required from ‘class std::_Optional_base<const CXXGRAPH::Edge<int>&>’
/usr/include/c++/7/optional:453:11:   required from ‘class std::optional<const CXXGRAPH::Edge<int>&>’
/home/codespace/workspace/CXXGraph/test/test1.cpp:52:5:   required from here
/usr/include/c++/7/optional:137:17: error: ‘constexpr std::_Optional_payload<_Tp,<anonymous>,<anonymous> >::_Optional_payload(std::_Optional_payload<_Tp,<anonymous> >::__ctor_tag<bool>,_Tp&&) [with _Tp = const CXXGRAPH::Edge<int>&; bool <anonymous> = true; bool <anonymous> = true]’ cannot be overloaded
       constexpr _Optional_payload(__ctor_tag<bool>,_Tp&& __other)
                 ^~~~~~~~~~~~~~~~~
/usr/include/c++/7/optional:127:17: error: with ‘constexpr std::_Optional_payload<_Tp,const _Tp&) [with _Tp = const CXXGRAPH::Edge<int>&; bool <anonymous> = true; bool <anonymous> = true]’
       constexpr _Optional_payload(__ctor_tag<bool>,^~~~~~~~~~~~~~~~~
/usr/include/c++/7/optional: In instantiation of ‘union std::_Optional_payload<const CXXGRAPH::Edge<int>&,true>::<unnamed>’:
/usr/include/c++/7/optional:160:7:   required from ‘struct std::_Optional_payload<const CXXGRAPH::Edge<int>&,true>’
/usr/include/c++/7/optional:425:30:   required from ‘class std::_Optional_base<const CXXGRAPH::Edge<int>&>’
/usr/include/c++/7/optional:453:11:   required from ‘class std::optional<const CXXGRAPH::Edge<int>&>’
/home/codespace/workspace/CXXGraph/test/test1.cpp:52:5:   required from here
/usr/include/c++/7/optional:162:24: error: non-static data member ‘std::_Optional_payload<const CXXGRAPH::Edge<int>&,true>::<unnamed union>::_M_payload’ in a union may not have reference type ‘std::_Optional_payload<const CXXGRAPH::Edge<int>&,true>::_Stored_type {aka const CXXGRAPH::Edge<int>&}’
           _Stored_type _M_payload;
                        ^~~~~~~~~~
/usr/include/c++/7/optional: In instantiation of ‘class std::optional<const CXXGRAPH::Edge<int>&>’:
/home/codespace/workspace/CXXGraph/test/test1.cpp:52:5:   required from here
/usr/include/c++/7/optional:467:7: error: static assertion failed: Invalid instantiation of optional<T>
       static_assert(__and_<__not_<is_same<remove_cv_t<_Tp>,nullopt_t>>,^~~~~~~~~~~~~
/usr/include/c++/7/optional:692:7: error: forming pointer to reference type ‘const CXXGRAPH::Edge<int>&’
       operator->() const
       ^~~~~~~~
/usr/include/c++/7/optional:696:7: error: forming pointer to reference type ‘const CXXGRAPH::Edge<int>&’
       operator->()
       ^~~~~~~~
/usr/include/c++/7/optional: In instantiation of ‘void std::_Optional_base<_Tp>::_M_construct(_Args&& ...) [with _Args = {CXXGRAPH::Edge<int>}; _Tp = const CXXGRAPH::Edge<int>&]’:
/usr/include/c++/7/optional:652:4:   required from ‘std::enable_if_t<std::is_constructible<_Tp,_Args&& ...>::value,_Tp&> std::optional<_Tp>::emplace(_Args&& ...) [with _Args = {CXXGRAPH::Edge<int>}; _Tp = const CXXGRAPH::Edge<int>&; std::enable_if_t<std::is_constructible<_Tp,_Tp&> = const CXXGRAPH::Edge<int>&]’
/usr/include/c++/7/optional:540:11:   required from ‘constexpr std::optional<_Tp>::optional(std::optional<_Up>&&) [with _Up = CXXGRAPH::Edge<int>; typename std::enable_if<std::__and_<std::__not_<std::is_same<_T1,_U1> >,std::is_constructible<_Tp,_Up&&>,std::is_convertible<_Up&&,_Tp>,std::__not_<std::__or_<std::is_constructible<_Tp,const std::optional<_Up>&>,std::optional<_Up>&>,const std::optional<_Up>&&>,std::optional<_Up>&&>,std::is_convertible<const std::optional<_Up>&,std::is_convertible<std::optional<_Up>&,std::is_convertible<const std::optional<_Up>&&,std::is_convertible<std::optional<_Up>&&,_Tp> > > >::value,bool>::type <anonymous> = 1; _Tp = const CXXGRAPH::Edge<int>&]’
/home/codespace/workspace/CXXGraph/include/Graph.hpp:176:49:   required from ‘std::optional<const CXXGRAPH::Edge<T>&> CXXGRAPH::Graph<T>::getEdge(long unsigned int) const [with T = int]’
/home/codespace/workspace/CXXGraph/test/test1.cpp:52:5:   required from here
/usr/include/c++/7/optional:404:11: error: new cannot be applied to a reference type
           ::new (std::__addressof(this->_M_payload._M_payload))
           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
             _Stored_type(std::forward<_Args>(__args)...);
             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/c++/7/optional:404:34: error: invalid conversion from ‘const void*’ to ‘void*’ [-fpermissive]
           ::new (std::__addressof(this->_M_payload._M_payload))
                  ~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/include/c++/7/bits/exception_ptr.h:40:0,from /usr/include/c++/7/exception:142,from /usr/include/c++/7/ios:39,from /usr/include/c++/7/ostream:38,from /usr/include/gtest/gtest.h:55,from /home/codespace/workspace/CXXGraph/test/test1.cpp:1:
/usr/include/c++/7/new:168:14: note:   initializing argument 2 of ‘void* operator new(std::size_t,void*)’
 inline void* operator new(std::size_t,void* __p) _GLIBCXX_USE_NOEXCEPT
              ^~~~~~~~
In file included from /usr/include/c++/7/bits/node_handle.h:39:0,from /home/codespace/workspace/CXXGraph/test/test1.cpp:1:
/usr/include/c++/7/optional: In instantiation of ‘void std::_Optional_base<_Tp>::_M_destruct() [with _Tp = const CXXGRAPH::Edge<int>&]’:
/usr/include/c++/7/optional:421:17:   required from ‘void std::_Optional_base<_Tp>::_M_reset() [with _Tp = const CXXGRAPH::Edge<int>&]’
/usr/include/c++/7/optional:651:4:   required from ‘std::enable_if_t<std::is_constructible<_Tp,bool>::type <anonymous> = 1; _Tp = const CXXGRAPH::Edge<int>&]’
/home/codespace/workspace/CXXGraph/include/Graph.hpp:176:49:   required from ‘std::optional<const CXXGRAPH::Edge<T>&> CXXGRAPH::Graph<T>::getEdge(long unsigned int) const [with T = int]’
/home/codespace/workspace/CXXGraph/test/test1.cpp:52:5:   required from here
/usr/include/c++/7/optional:413:38: error: the type being destroyed is ‘CXXGRAPH::Edge<int>’,but the destructor refers to ‘std::_Optional_base<const CXXGRAPH::Edge<int>&>::_Stored_type {aka const CXXGRAPH::Edge<int>&’
         this->_M_payload._M_payload.~_Stored_type();
         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~
CMakeFiles/test_exe.dir/build.make:86: recipe for target 'CMakeFiles/test_exe.dir/test/test1.cpp.o' failed
make[2]: *** [CMakeFiles/test_exe.dir/test/test1.cpp.o] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/test_exe.dir/all' failed
make[1]: *** [CMakeFiles/test_exe.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2

我不知道我在哪里错,我尝试了不同的解决方案,但没人能解决。有人知道会发生什么吗?这一段代码有什么错?在使用可选功能时,我缺少一些东西吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...