2011-06-22 11 views
6

Mam szablon klasy z funkcji członka, który ma lambda, który chce użyć parametru typu klasy szablonu. Nie kompiluje się wewnątrz lambda, ale zgodnie z oczekiwaniami osiąga sukces poza lambdą.Dostęp do klasy szablonu typ parametru wewnątrz funkcji składowej z lambda nie

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; 
} 

Błąd kompilacji:

error C2653: 'reporter' : is not a class or namespace name 

Dlaczego nie mogę wejść do klasy szablonu typ parametru wewnątrz lambda funkcji członka?

Co muszę zrobić, aby uzyskać dostęp do klasy szablonu typu parametru wewnątrz lambda funkcji członka?

+3

Kompiluje dla mnie na GCC 4.6. Jaka jest twoja platforma/kompilator? –

+0

@Kerrek: Visual C++ 2010. –

Odpowiedz

2

użycie 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);  
     }); 
    } 
}; 
+0

Ah ! Próbowałem już 'typedef'ing, ale przegapiłem kluczową' agencję <> - dzięki! –

+1

Ale czy _myreporter zawsze ocenia "wcout_reporter"? ponieważ 'agency <>' akceptuje parametr domyślny, jest skrótem dla 'agency ' iw tej klasie '_myreporter' jest typowane jako cueout_reporter. A może mytempalte <> wewnątrz instancji szablonu faktycznie się ocenia? – ted

+1

To zależy od kompilatora. VC10, na przykład, nie przechwytuje przestrzeni nazw poza lambdą. – Ajay

4

ten powinien skompilować OK jak jest. Wygląda na to, że Twój kompilator ma błąd w regułach wyszukiwania nazw w lambda. Można spróbować dodawania typedef dla reporter wewnątrz report_all.

+0

Tak, VS 2010 ma więcej z nich w kontekście C++ 0x, na przykład ten jeden, że potknął się wczoraj: http://stackoverflow.com/q/6432658/6345 –