c++ - 使用 lambda 访问成员函数内的类模板参数类型失败

标签 c++ templates lambda c++11 traits

我有一个带有成员函数的类模板,该函数有一个想要使用类模板参数类型的 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 中的类模板参数类型?

最佳答案

这应该可以按原样编译。您的编译器似乎在 lambda 中的名称查找规则中存在错误。您可以尝试在 report_all 中为 reporter 添加一个 typedef

关于c++ - 使用 lambda 访问成员函数内的类模板参数类型失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6442129/

相关文章:

java - 创建一个生成另一个给定函数的 x 和 y 值的方法

c++ - 为什么映射页面不发送 sigsegv?

c++ - for循环的初始化语句有两种类型的变量

c++ - 是否可以在模板中定义指向外部 -"C"函数类型的指针?

C++ 模板宏快捷方式

C# 在 lambda 表达式中声明变量

C++ boost线程在实例化两次时导致段错误

c++ - 在使用带有 https 的 url 时,我遇到了 Casablanca C++ 的问题

c++ - 为什么 C++ 模板编译器不能从协变智能指针参数推断类型?

kotlin - 如何将 lambdas 链接到 Kotlin 中的结果 lambda?