2017-09-21 5 views
0

J'ai un modèle de classe comme Sample.hpp avec alias de type X.Impossible d'accéder à l'alias de type de la définition du modèle de classe dans un fichier séparé sans avoir à taper la déclaration complète de type alias

#ifndef SAMPLE_HPP 
#define SAMPLE_HPP 

template<typename STA, typename STB> 
class Sample 
{ 
    using X = Sample<STA,STB>; 

public: 
    Sample(); 
    inline X* GetNext() const; 

private: 
    X* Next; 
}; 

#include "Sample.cpp" 

#endif // SAMPLE_HPP 

et les définitions sont en Sample.cpp.

#include "Sample.hpp" 

template<typename STA, typename STB> 
Sample<STA,STB>::Sample() { 
    Next = nullptr; 
} 

template<typename STA, typename STB> 
typename Sample<STA,STB>::X* Sample<STA,STB>::GetNext() const { 
    return this->Next; 
} 

Ma question est que, sont-il d'autres façons de définir GetNext fonction. Par exemple sans nom de type ou sans déclaration complète de Exemple de modèle de classe. Quand je change le code pour

template<typename STA, typename STB> 
Sample<STA,STB>* Sample<STA,STB>::GetNext() const { 
    return this->Next; 
} 

Il fonctionne, mais je ne peux pas alias de type d'utilisation ici directement, par exemple:

template<typename STA, typename STB> 
X* Sample<STA,STB>::GetNext() const { 
    return this->Next; 
} 

Répondre

4

Vous pouvez utiliser un type de retour de fuite à l'aide de auto:

template<typename STA, typename STB> 
auto Sample<STA, STB>::GetNext() const -> X* { 
    return this->Next; 
} 
+0

Merci beaucoup, pouvez-vous s'il vous plaît expliquer cela plus en détail? –

+0

@CherkesgillerTural Sure chose. Donc, si vous mettez "X *" au début, le compilateur n'a aucun moyen de savoir que "X" est supposé l'être, donc vous obtenez une erreur. Mais si vous l'écrivez * après *, alors le compilateur peut chercher dans le champ 'Sample ' pour 'X'. Si vous l'avez déjà mis, il n'a pas encore rencontré 'Sample ', donc il ne peut pas y trouver 'X'. Plus d'informations à ce sujet [ici] (http://en.cppreference.com/w/cpp/language/function). – Rakete1111

+0

Merci beaucoup, @ Rakete111. –