2010-02-11 9 views
1

a fourni le code ci-dessous:C++/templates/GCC 4.0 bug?

template<class _ResClass, class _ResLoader=DefaultLoader> 
class Resource 
: public BaseResource 
{ 
private: 
    _ResClass data_; 

public: 
    explicit Resource(const std::string& path) 
    : data_(_ResLoader::load<_ResClass>(path)) 
    { }; 
}; 

Pourquoi serait-il l'échec mais celui-ci fonctionnera ?:

template<class _ResClass, class _ResLoader=DefaultLoader> 
class Resource 
: public BaseResource 
{ 
private: 
    _ResClass data_; 

public: 
    explicit Resource(const std::string& path) 
    : data_(**DefaultLoader**::load<_ResClass>(path)) 
    { }; 
}; 
+3

Pas une réponse, mais des noms comme _ResLoader qui commence par un trait de soulignement et une lettre majuscule sont réservés en C++ - vous n'êtes pas autorisé à créer de tels noms dans votre propre code. –

+0

Et quel était le message d'erreur? –

+0

Qu'est-ce que 'DefaultLoader :: load'? Est-ce une fonction membre modélisée? Un type interne de 'DefaultLoader'? –

Répondre

7

charge est un nom à charge, donc

data_(_ResLoader::template load<_ResClass>(path)) 

pour la même raison que typename est nécessaire lorsqu'un nom est dépendant d'un type.

+0

Vous rock. Merci! –

4

Vous devez faire _ResLoader::template load<_ResClass>(path) au lieu de _ResLoader::load<_ResClass>(path). Lors de l'accès à un modèle imbriqué avec un paramètre de modèle, vous devez utiliser le mot-clé template (de la même manière que vous devez utiliser le mot-clé typename pour les types imbriqués dans les paramètres de modèle).

+0

Merci! Votre réponse compte aussi! –