2013-02-06 18 views
6

sıkıntılardan:C++ şablonu tip yapı ile işlev şablon argümanı Bu kod unexplicably derleme değil

struct sometype 
{ 
    template <typename T> 
    T* get() { return nullptr; } 
}; 

template <typename T> 
struct anothertype 
{ 
#if 1 
    template <typename T2> struct some_wrapper { typedef T2 type; }; 
    typedef typename some_wrapper<sometype>::type thetype; 
#else 
    typedef sometype thetype; 
#endif 
    typedef thetype* Ptr; 

    Ptr m_ptr; 
    T* get() { return m_ptr->get<T>(); } 
}; 

Ben 0'a #if argüman değiştirirseniz, her nasılsa sabittir. Birisi buna ışık tutabilir mi? Unutmayın ki, anlamsız olan some_wrapper, aslında gerçek kodumda yararlı bir şeyler yapıyor. aşağıdaki gibi ben -fstd=gnu++11 ile g ++ 4.7.1 kullanıyorum

, hatası (I anothertype<T>::get beyan hattına işaret geçerli:

error: expected primary-expression before '>' token 
error: expected primary-expression before ')' token 
+0

Derleyiciniz aracılığıyla gönderdiğiniz kodu tam olarak çalıştırırsanız, bu hatayı alıyor musunuz? –

+0

@ DavidRodríguez-dribeas http://ideone.com/N8dQoj (tam olarak sorudan kod) – leemes

cevap

6

sen işlev çağrısını düzeltmek gerekir, template anahtar kelime ekleme:

T* get() { return m_ptr->template get<T>(); } 

Sözdiziminin açıklaması için this link adresini kontrol edebilirsiniz.

8

tüm typedefs ile söylemek çok zor, ama ben ediyorum bahse ihtiyacınız şu şekildedir:

m_ptr->template get<T>(); 
+0

+1 ilk olmak için. –

+0

Ama ... neden? m_ptr * her zaman * 'sometype *' dır. – ipc

+1

@ipc, #if 1 'değerine sahip olacak, bu yüzden 'm_ptr' bir' typename some_wrapper' :: type * ', bağımlı tip –