Временное решение для недостатков VS 2013 SFINAE

Я пытаюсь починить библиотеку (entityx), который в настоящее время не компилируется в Windows с использованием VS 2013. Он прекрасно компилируется в Linux с gcc, а также в Windows с MinGW.

Кажется, проблема в SFINAE — я думаю, что VS 2013 не игнорирует ошибки замены шаблонов.

Существует сообщение об этой проблеме в Microsoft Connect, Вот.

Прежде чем погрузиться в entityx, Вот пример проблемы (взят из отчета в Microsoft Connect):

#include <vector>
#include <future>

using namespace std;

typedef int async_io_op;

struct Foo
{
//! Invoke the specified callable when the supplied operation completes
template<class R> inline std::pair < std::vector < future < R >> , std::vector < async_io_op >> call(const std::vector<async_io_op> &ops, const std::vector < std::function < R() >> &callables);
//! Invoke the specified callable when the supplied operation completes
template<class R> std::pair < std::vector < future < R >> , std::vector < async_io_op >> call(const std::vector < std::function < R() >> &callables) { return call(std::vector<async_io_op>(), callables); }
//! Invoke the specified callable when the supplied operation completes
template<class R> inline std::pair<future<R>, async_io_op> call(const async_io_op &req, std::function<R()> callback);
//! Invoke the specified callable when the supplied operation completes
template<class C, class... Args> inline std::pair<future<typename std::result_of<C(Args...)>::type>, async_io_op> call(const async_io_op &req, C callback, Args... args);
};

int main(void)
{
Foo foo;
std::vector<async_io_op> ops;
std::vector < std::function < int() >> callables;
foo.call(ops, std::move(callables));
return 0;
}

Я получаю следующую ошибку при попытке скомпилировать это:

ошибка C2064: термин не оценивает функцию, принимающую 0 аргументов

c: \ program files (x86) \ Microsoft Visual Studio 12.0 \ vc \ include \ xrefwrap 58

Видимо, мы можем использовать std::enable_if обойти эту проблему. Однако я не могу понять, как.

Кто-нибудь знает, как я могу исправить эту ошибку компиляции?

редактировать: Полная продукция VS 2013:

1>------ Build started: Project: VS2013_SFINAE_Failure, Configuration: Debug Win32 ------
1>  test_case.cpp
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\xrefwrap(58): error C2064: term does not evaluate to a function taking 0 arguments
1>          c:\program files (x86)\microsoft visual studio 12.0\vc\include\xrefwrap(118) : see reference to class template instantiation 'std::_Result_of<_Fty,>' being compiled
1>          with
1>          [
1>              _Fty=std::vector<std::function<int (void)>,std::allocator<std::function<int (void)>>>
1>          ]
1>          c:\users\jarrett\downloads\vs2013_sfinae_failure\vs2013_sfinae_failure\test_case.cpp(25) : see reference to class template instantiation 'std::result_of<std::vector<std::function<int (void)>,std::allocator<_Ty>> (void)>' being compiled
1>          with
1>          [
1>              _Ty=std::function<int (void)>
1>          ]
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

1

Решение

VS2013 компилирует код, если вы замените std::result_of с этими decltype + std::declval эквивалент. Так что поменяй последний Foo::call() определение к

template<class C, class... Args>
inline pair<future<decltype(declval<C>()(declval<Args>()...))>, async_io_op>
call(const async_io_op& req, C callback, Args... args);

Если я правильно понимаю ошибку, это связано с описанным дефектом Вот, но тогда удивительно, что и GCC, и Clang удается собрать result_of Код без ошибок.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]