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编译器有问题?
答案 0 :(得分:3)
编译类模板成员函数时的'void std :: list&lt; _Ty&gt; :: remove(const _Ty&amp;)' [_Ty = ServerLoginResponseCallback]
您正在实例化std::list<std::function<void (ServerLoginResponsePtr)>>
,并尝试在其上调用erase
,这取决于在两个operator==
对象上调用std::function
,但是std::function
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...)>&);
答案 1 :(得分:1)
您似乎遇到了实例化问题。我刚刚尝试重现你的错误,但我的MSVC成功编译了这段代码。
请向我们展示更多代码))例如,向我们展示如何在创建后使用此列表。