Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::带有重载lambda的变体,MSVC的替代品?_C++_Visual C++_C++17 - Fatal编程技术网

C++ std::带有重载lambda的变体,MSVC的替代品?

C++ std::带有重载lambda的变体,MSVC的替代品?,c++,visual-c++,c++17,C++,Visual C++,C++17,C++偏好重载“技巧”,其中每个变量可以通过模板化的代码>操作器()来访问。使用clang或gcc编译时,可以找到代码片段并执行良好 但是,这不是使用MSVC()编译的: 模板结构重载:Ts。。。{使用Ts::运算符()…;}; 模板重载(Ts…)->重载; 它抛出各种错误并最终失败: warning C4346: 'Ts::()': dependent name is not a type note: prefix with 'typename' to indicate a type

C++偏好重载“技巧”,其中每个变量可以通过模板化的代码>操作器()来访问。使用clang或gcc编译时,可以找到代码片段并执行良好

但是,这不是使用MSVC()编译的:

模板结构重载:Ts。。。{使用Ts::运算符()…;};
模板重载(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  
警告C4346:'Ts::()':依赖名称不是类型
注:前缀为“typename”表示类型
注意:请参阅正在编译的类模板实例化“重载”
错误C2143:语法错误:缺少“;”在“…”之前
错误C2059:语法错误:“…”
错误C2238:在“;”之前出现意外标记
错误C2988:无法识别的模板声明/定义
错误C2143:语法错误:在“…”之前缺少“)”
错误C2143:语法错误:缺少“;”在“…”之前
错误C2365:“Ts”:重新定义;以前的定义是“模板参数”
注:见“Ts”声明
错误C2059:语法错误:')'
错误C2059:语法错误:'->'
错误C2065:“Ts”:未声明的标识符
错误C3544:“Ts”:参数包需要类型模板参数
还有别的选择吗?是否缺少编译器的选项?

模板
template<class...Ts>
struct overloaded_t {};

template<class T0>
struct overloaded_t<T0>:T0 {
  using T0::operator();
  overloaded_t(T0 t0):T0(std::move(t0)) {}
};
template<class T0, class T1, class...Ts>
struct overloaded_t<T0, T1, Ts...>:T0, overloaded_t<T1, Ts...> {
  using T0::operator();
  using overloaded_t<T1, Ts...>::operator();
  overloaded_t(T0 t0, T1 t1, Ts... ts):
    T0(std::move(t0)),
    overloaded_t<T1, Ts...>(std::move(t1), std::move(ts)...)
  {}
};

template<class...Ts>
overloaded_t<Ts...> overloaded(Ts...ts){ return {std::move(ts)...}; }
结构重载_t{}; 模板 结构重载\u t:T0{ 使用T0::operator(); 重载_t(T0-T0):T0(std::move(T0)){ }; 模板 结构重载\u t:T0,重载\u t{ 使用T0::operator(); 使用重载的_t::operator(); 过载(T0 T0,T1 T1,Ts…Ts): T0(标准::移动(T0)), 重载(std::move(t1),std::move(ts)…) {} }; 模板 重载\u t重载(Ts…Ts){return{std::move(Ts)…};}

或者升级到最新的编译器。

@Someprogrammerdude但这是一个伪错误——MSVC似乎认为这是到
()
的转换运算符,这确实不是一个很好的类型。这对我来说在15.7.1G版本上编译很好。Godbolt使用的是编译器版本19.10.25017,我的15.7.1版本有编译器版本19.14.26428.1Ha。。好的,这是一个编译器版本的问题,它确实适用于最新版本。我看看能不能更新这台机器。与此同时,它仍然强调语法是错误的。
template<class...Ts>
struct overloaded_t {};

template<class T0>
struct overloaded_t<T0>:T0 {
  using T0::operator();
  overloaded_t(T0 t0):T0(std::move(t0)) {}
};
template<class T0, class T1, class...Ts>
struct overloaded_t<T0, T1, Ts...>:T0, overloaded_t<T1, Ts...> {
  using T0::operator();
  using overloaded_t<T1, Ts...>::operator();
  overloaded_t(T0 t0, T1 t1, Ts... ts):
    T0(std::move(t0)),
    overloaded_t<T1, Ts...>(std::move(t1), std::move(ts)...)
  {}
};

template<class...Ts>
overloaded_t<Ts...> overloaded(Ts...ts){ return {std::move(ts)...}; }