Не удается получить доступ к типу параметра шаблона класса внутри функции-члена с помощью лямбды - PullRequest
6 голосов
/ 22 июня 2011

У меня есть шаблон класса с функцией-членом, которая имеет лямбду, которая хочет использовать тип параметра шаблона класса. Он не компилируется внутри лямбды, но, как и ожидалось, преуспевает вне лямбды.

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

Почему я не могу получить доступ к типу параметра шаблона класса внутри лямбда-функции-члена?

Что мне нужно сделать, чтобы получить доступ к типу параметра шаблона класса внутри лямбда-функции-члена?

Ответы [ 2 ]

4 голосов
/ 22 июня 2011

Это должно скомпилировать ОК как есть. Похоже, что у вашего компилятора есть ошибка в правилах поиска имен в лямбде. Вы можете попробовать добавить typedef для reporter внутри report_all.

2 голосов
/ 22 июня 2011

Использовать typedef:

template <typename reporter = wcout_reporter>
class agency
{
    typedef reporter _myreporter;
public:   
    void report_all()    
    {        
        reporter::report(L"dummy"); // Compiles.        

        std::for_each(reports_.begin(), reports_.end(), [this](const std::wstring& r)        
        {   
            // Take it
            agency<>::_myreporter::report(r);    
        });
    }
};
...