2011-06-22 14 views
6

Sınıf şablonu parametre türünü kullanmak isteyen bir lambdaya sahip üye işlevi olan bir sınıf şablonum var. Lambda içinde derlenemez, ancak lambda dışında beklenen şekilde başarılı olur.Bir lambda ile üye işlevi içinde bir sınıf işlevi parametre türüne erişme başarısız oluyor

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

derleme hatası:

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

Neden üye işlev lambda içindeki sınıf şablonu parametre türünü erişemiyorum?

Sınıf elemanı parametre türüne lambda üye işlevi içinde erişmek için ne yapmam gerekir?

+3

GCC 4.6 benim için derler. Platformunuz/derleyiciniz nedir? –

+0

@Kerrek: Visual C++ 2010. –

cevap

2

Kullanım 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 ! Çoktan yazmayı denedim, ama çok önemli olan ajansı kaçırdım <> '- teşekkürler! –

+1

Ancak, _myreporter daima "wcout_reporter" olarak değerlendirilmeyecek mi? ajansı <> 'varsayılan parametreyi kabul ettiğinden, ajans 'wcout_reporter> için bir kısa yoldur ve bu sınıfta' _myreporter' wcout_reporter olarak yazılmıştır. Veya şablonun bir örneğindeki kendi kendini gerçekten değerlendirir mi? – ted

+1

Bu, derleyiciye göre değişir. VC10, örneğin lambda'nın dışındaki ad alanını yakalamaz. – Ajay

4

Bu, OK olduğu gibi derlenmelidir. Derleyici, bir lambda isim arama kurallarında bir hata var gibi görünüyor. report_all içinde reporter için typedef eklemeyi deneyebilirsiniz.

+0

Evet, VS 2010, C++ 0x bağlamında bunlardan daha fazlasını içeriyor, örneğin, bu, şu an için bastığım: http://stackoverflow.com/q/6432658/6345 –

İlgili konular