2016-06-29 14 views
2
zeigen

ich Helfer struct machen wollte, die typedef vom Typ enthalten würde, dass Template-Zeiger-Parameter zeigen auf:Erster Typ, Zeigertyp auf

template<class T*> 
struct pointer_lower_level 
{ 
    typedef typename T type_pointed; 
}; 

Aber es gibt mir Fehler (GCC 5.3.0) :

error: expected nested-name-specifier before 'T' 
    typedef typename T type_pointed; 
        ^
error: expected ';' at end of member declaration 

error: 'type_pointed' does not name a type 
    typedef typename T type_pointed; 
         ^

Für mich sieht es aus wie rechtliche Syntax, aber gut, ich hatte sehr langen Tag so kann ich mich irren.

+2

Ich weiß nicht, warum Sie Ihre eigenen sind Implementierung, so dass, wenn es so können Sie es verwenden, nur FYI: [die Standardbibliothek hat 'std :: remove_pointer'] (http: // en. cppreference.com/w/cpp/types/remove_pointer). – jaggedSpire

Antwort

6

Unter der Annahme, dass Sie nicht wollen, std::remove_pointer verwenden, ich glaube, was Sie wollen, ist ein partial template specialization zu verwenden.

template <typename> 
struct pointer_lower_level; 

template <typename T> 
struct pointer_lower_level<T*> { 
    using type_pointed = T; 
}; 
3

Sie benötigen eine Vorlage Spezialisierung:

// first declare the general template... 
template<class T> 
struct pointer_lower_level; 

// ...then provide a partial specialization for pointers 
template<class T> 
struct pointer_lower_level<T*> 
// note this... ----------^^^^ 
{ 
    typedef T type_pointed; 
};