MSVC 2010模板编译问题

时间:2010-07-27 22:05:19

标签: c++ visual-c++ templates

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 个答案:

答案 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成功编译了这段代码。

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