代码之家  ›  专栏  ›  技术社区  ›  shaz

MSVC 2010模板编译器问题

  •  0
  • shaz  · 技术社区  · 14 年前
    1>C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\list(1194): error C2451: conditional expression of type 'void' is illegal
    1>          Expressions of type void cannot be converted to other types
    1>          C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\list(1188) : while compiling class template member function 'void std::list<_Ty>::remove(const _Ty &)'
    1>          with
    1>          [
    1>              _Ty=ServerLoginResponseCallback
    1>          ]
    1>          c:\users\shawn\edu\csclient\ConfigurationServerClient.h(56) : see reference to class template instantiation 'std::list<_Ty>' being compiled
    1>          with
    1>          [
    1>              _Ty=ServerLoginResponseCallback
    1>          ]
    

    下面是生成错误的代码…

    typedef std::shared_ptr<protocols::ServerLoginResponse> ServerLoginResponsePtr;
    typedef std::function<void (ServerLoginResponsePtr)> ServerLoginResponseCallback;
    typedef std::list<ServerLoginResponseCallback> ServerLoginResponseCallbackList;
    

    所以我们有一个返回void并接受shared-ptr类型参数的函数列表。有人知道MSVC编译器为什么有问题吗?

    2 回复  |  直到 14 年前
        1
  •  1
  •   GooRoo    14 年前

    似乎您在实例化方面有问题。我刚刚尝试重现你的bug,但是我的MSVC成功地编译了这段代码。

    请向我们展示更多代码),例如,向我们展示如何在创建后使用此列表。

        2
  •  3
  •   David Rodríguez - dribeas    14 年前

    编译类模板成员函数“void std::list<_ty>::remove(const_ty&)” 使用[\u ty=ServerLoginResponseCallback]

    你正在实例化 std::list<std::function<void (ServerLoginResponsePtr)>> 尝试打电话 erase 这取决于你打电话 operator== 两方面 std::function 对象,但 STD::功能 S不可比(仅限于 nullptr ):

    _§20.8.14.2[func.wrap.func](摘自最终草案N3092):

    成员函数:

    // deleted overloads close possible hole in the type system
    template<class R2, class... ArgTypes2> 
    bool operator==(const function<R2(ArgTypes2...)>&) = delete;
    
    template<class R2, class... ArgTypes2> 
    bool operator!=(const function<R2(ArgTypes2...)>&) = delete;
    

    这些是自由功能:

    template<class R, class... ArgTypes> 
    bool operator==(const function<R(ArgTypes...)>&, nullptr_t);
    
    template<class R, class... ArgTypes>
    bool operator==(nullptr_t, const function<R(ArgTypes...)>&);