Перегруженная cppreference «хитрость», при которой каждый вариант может быть доступен через шаблонную перегрузку operator()
, не компилируется с компилятором Visual C ++.Фрагмент кода можно найти здесь и прекрасно выполняется при компиляции с помощью clang или gcc.
Однако, это не компилируется с MSVC ( см. На godbolt ):
template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; };
template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>;
Выдает различные ошибки и в конечном итоге дает сбой:
warning C4346: 'Ts::()': dependent name is not a type
note: prefix with 'typename' to indicate a type
note: see reference to class template instantiation 'overloaded<Ts...>' being compiled
error C2143: syntax error: missing ';' before '...'
error C2059: syntax error: '...'
error C2238: unexpected token(s) preceding ';'
error C2988: unrecognizable template declaration/definition
error C2143: syntax error: missing ')' before '...'
error C2143: syntax error: missing ';' before '...'
error C2365: 'Ts': redefinition; previous definition was 'template parameter'
note: see declaration of 'Ts'
error C2059: syntax error: ')'
error C2059: syntax error: '->'
error C2065: 'Ts': undeclared identifier
error C3544: 'Ts': parameter pack expects a type template argument
Есть ли альтернатива?Мне не хватает опций для компилятора?