gpt4 book ai didi

c++ - 使用 Visual Studio 2015 : error C3546 在 lambda 中扩展参数包

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:21:42 50 4
gpt4 key购买 nike

正在关注 this question ,我尝试编译以下代码:

template<typename... Types>
auto for_each(type_list<Types...>) {
return [](auto&& f) {
using swallow = int[];
(void) swallow { 0, (void(f(tag<Types>{})), 0)... };
};
}

这适用于 gcc,但在 visual studio 2015 中会产生以下错误:

main.cpp(19): error C3546: '...': there are no parameter packs available to expand

main.cpp(48): note: see reference to function template instantiation 'auto for_each::<lambda_9a452bac795593df4639d6433fa242d3>::operator ()<main::<lambda_b7b233027d9428cb5ddc16c87ea59d21>>(main::<lambda_b7b233027d9428cb5ddc16c87ea59d21> &&) const' being compiled

main.cpp(18): error C3520: 'Types': parameter pack must be expanded in this context

main.cpp(18): error C2672: 'operator __surrogate_func': no matching overloaded function found

main.cpp(18): error C2893: Failed to specialize function template 'auto main::<lambda_b7b233027d9428cb5ddc16c87ea59d21>::operator ()(_T1) const'

main.cpp(18): note: With the following template arguments:

main.cpp(18): note: '_T1=tag<Types>'

当符号 ... 未绑定(bind)到参数包(?)时,视觉编译器似乎无法扩展

有没有办法解决这个问题?

这是生成错误的最小示例:

#include <iostream>
#include <string>

template<typename... > struct type_list {};

template<typename T>
struct tag { using type = T; };

template<typename... Types>
auto for_each(type_list<Types...>) {
return [](auto&& f) {
using swallow = int[];
(void) swallow { 0, (void(f(tag<Types>{})), 0)... };
};
}

struct A {
static std::string get_type_name() { return { "A" }; }
};

struct AA : A {
static std::string get_type_name() { return { "AA" }; }
};

int main() {
for_each(type_list<A, AA>{}) (
[&](auto t) {
using B = typename decltype(t)::type;
std::cout << B::get_type_name() << std::endl;
}
);

return 0;
}

最佳答案

我最终用结构替换了 for_each 函数:

template<typename T> struct for_each {};

template<typename... Types>
struct for_each<type_list<Types...>> {
template<typename F>
for_each(F f) {
using swallow = int[];
(void) swallow { 0, (f(tag<Types>{}), 0)... };
}
};

稍微修改一下用法:

int main() {
for_each<type_list<A, AA>>{
[&](auto t) {
using B = typename decltype(t)::type;
std::cout << B::get_type_name() << std::endl;
}
};

return 0;
}

关于c++ - 使用 Visual Studio 2015 : error C3546 在 lambda 中扩展参数包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39425473/

50 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com