使用 lambda 访问成员函数内的类模板参数类型失败
我有一个带有成员函数的类模板,该成员函数有一个想要使用类模板参数类型的 lambda。它无法在 lambda 内部编译,但如预期的那样在 lambda 外部编译成功。
struct wcout_reporter
{
static void report(const std::wstring& output)
{
std::wcout << output << std::endl;
}
};
template <typename reporter = wcout_reporter>
class agency
{
public:
void report_all()
{
reporter::report(L"dummy"); // Compiles.
std::for_each(reports_.begin(), reports_.end(), [this](const std::wstring& r)
{
reporter::report(r); // Fails to compile.
});
}
private:
std::vector<std::wstring> reports_;
};
int wmain(int /*argc*/, wchar_t* /*argv*/[])
{
agency<>().report_all();
return 0;
}
编译错误:
error C2653: 'reporter' : is not a class or namespace name
为什么无法访问成员函数lambda内部的类模板参数类型?
我需要做什么才能访问成员函数 lambda 内的类模板参数类型?
I have a class template with a member function that has a lambda which wants to use a class template parameter type. It fails to compile inside the lambda but succeeds, as anticipated, outside the lambda.
struct wcout_reporter
{
static void report(const std::wstring& output)
{
std::wcout << output << std::endl;
}
};
template <typename reporter = wcout_reporter>
class agency
{
public:
void report_all()
{
reporter::report(L"dummy"); // Compiles.
std::for_each(reports_.begin(), reports_.end(), [this](const std::wstring& r)
{
reporter::report(r); // Fails to compile.
});
}
private:
std::vector<std::wstring> reports_;
};
int wmain(int /*argc*/, wchar_t* /*argv*/[])
{
agency<>().report_all();
return 0;
}
The compilation error:
error C2653: 'reporter' : is not a class or namespace name
Why can't I access the class template parameter type inside the member function lambda?
What do I need to do to gain access to the class template parameter type inside the member function lambda?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这应该可以按原样编译。您的编译器似乎在 lambda 中的名称查找规则中存在错误。您可以尝试在
report_all
内添加reporter
的typedef
。This should compile OK as-is. It appears that your compiler has a bug in the name lookup rules in a lambda. You could try adding a
typedef
forreporter
insidereport_all
.使用类型定义:
Use typedef: