2011-06-22 48 views
6

我有一個帶有成員函數的類模板,它具有要使用類模板參數類型的lambda。它不能在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中的類模板參數類型?

+3

編譯我在GCC 4.6。什麼是您的平臺/編譯器? –

+0

@Kerrek:Visual C++ 2010. –

回答

2

使用的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

啊!我已經嘗試過'typedef'ing,但是錯過了關鍵的'''''' - 謝謝! –

+1

但不會_myreporter總是評估爲'wcout_reporter'?因爲'agency <>'接受默認參數,所以它是'agency '的縮寫,在那個類中'_myreporter'被typedefed爲wcout_reporter。或者,模板實例中的mytempalte <>實際上是否自己評估? – ted

+1

這取決於編譯器。例如,VC10不捕獲lambda之外的名稱空間。 – Ajay

4

這應該按原樣編譯。看來你的編譯器在lambda中的名稱查找規則中有一個錯誤。您可以嘗試在report_all內爲reporter添加typedef

+0

是的,VS 2010在C++ 0x上下文中有更多的這些,例如我昨天絆倒的那個:http://stackoverflow.com/q/6432658/6345 –

相關問題