2015-05-12 40 views
4

在MSVC2010下面的代碼提供:
error C2039: 'my_type' : is not a member of ''global namespace''如何從一個對象實例得到一個成員的typedef

template<typename T> 
class C 
{ 
public: 
    typedef T my_type; 
}; 

C<int> c; 

auto f = [&c]() { 
    decltype(c)::my_type v2; // ERROR C2039 
}; 

我找到了一個跛腳的方式來解決它,但我想知道什麼的正確方法是當你只有一個對象實例時纔得到typedef。

+2

升級你的編譯器版本或依賴或解決方法,一個在我腦海中是'身份 ::類型:: my_type V2;'和'模板結構身份{typedef的T形; };' –

+0

完美,謝謝!我不確定這是VC2010問題,還是我不知道該怎麼做。 – tukra

+1

你不需要捕獲'c'(如果它是全局的或靜態的)。 – 0x499602D2

回答

1

從非常有益的意見礫岩我得到了一個工作方案。感謝大家。 remove_reference用作身份對象的雙重用途。

template<typename T> 
class C { 
public: 
    typedef T my_type; 
}; 

void g() { 
    C<int> c; 

    auto f = [&c]() { 
    typedef remove_reference<decltype(c)>::type::my_type my_type; 
    my_type v; // Works!! 
    }; 
} 
+1

要麼'remove_reference'或'identity'是多餘的,只挑一個 –

+0

即使MSVC接受原樣,該標準規定,你在這裏使用'typename',即'的typedef typename的remove_reference ::類型:: my_type my_type;'。 – Oberon

+0

@Oberon typename不需要 –

相關問題