2011-06-22 39 views
6

Tôi có mẫu lớp có hàm thành viên có lambda muốn sử dụng loại thông số mẫu lớp. Nó không biên dịch bên trong lambda nhưng thành công, như dự đoán, bên ngoài lambda.Truy cập loại tham số mẫu lớp bên trong hàm thành viên có lambda không thành công

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

Các lỗi biên dịch:

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

Tại sao tôi không thể truy cập vào lớp mẫu tham số kiểu bên trong hàm thành viên lambda?

Tôi cần làm gì để truy cập vào loại thông số mẫu lớp bên trong hàm lambda thành viên?

+3

Biên dịch đối với tôi trên GCC 4.6. Nền tảng/trình biên dịch của bạn là gì? –

+0

@Kerrek: Visual C++ 2010. –

Trả lời

2

Sử dụng 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 ! Tôi đã thử 'typedef'ing, nhưng bỏ lỡ cơ quan' cơ bản <> '- cảm ơn! –

+1

Nhưng wont _myreporter luôn đánh giá 'wcout_reporter'? vì 'agency <>' chấp nhận tham số mặc định, nó là viết tắt của 'agency ' và trong lớp đó '_myreporter' được gõ là wcout_reporter. Hoặc mytempalte <> bên trong một thể hiện của mẫu thực sự đánh giá chính nó? – ted

+1

Điều đó tùy thuộc vào trình biên dịch. VC10, ví dụ không nắm bắt được không gian tên bên ngoài lambda. – Ajay

4

Điều này sẽ biên dịch OK thành hiện thực. Dường như trình biên dịch của bạn có lỗi trong các quy tắc tra cứu tên trong một lambda. Bạn có thể thử thêm một số typedef cho reporter bên trong report_all.

+0

Có, VS 2010 có nhiều hơn trong số này trong bối cảnh C++ 0x, ví dụ này mà tôi đã vấp ngã qua ngày hôm qua: http://stackoverflow.com/q/6432658/6345 –

Các vấn đề liên quan