Проблема компилятора шаблонов MSVC 2010 - PullRequest
0 голосов
/ 28 июля 2010
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 ]

3 голосов
/ 28 июля 2010

при компиляции функции-члена шаблона класса 'void std :: list <_Ty> :: remove (const _Ty &)' с [_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 голос
/ 28 июля 2010

Кажется, у вас проблемы с реализацией.Я только что попытался воспроизвести вашу ошибку, но мой MSVC успешно скомпилировал этот код.

Пожалуйста, покажите нам больше кода)) Например, покажите, как вы используете этот список после создания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...