2010-10-28 5 views
1

Dans ce code (prêt à compiler):Pourquoi je reçois zéro?

 #include "stdafx.h" 
     #include <iostream> 
     #include <sstream> 

     using std::cout; 

     template<class T, int first, int second> 
     T make() 
     { 
      T result = T(); 
      std::stringstream interpreter; 
      interpreter << first << '.' << second; 
      interpreter >> result; 
      return result; 
     } 

template<int first, int second, class T = double> 
    struct Make 
    { 
     typedef T value_type; 
     static value_type value; 

    }; 

    template<int first, int second, class T> 
    T Make<first,second,T>::value = make<T,first,second>(); 



    template<int first, int second> 
    struct Real 
    { 
     typedef double type; 
     static type value; 
    }; 

     template<int first, int second> 
    typename Real<first,second>::type typename Real<first,second>::value = typename Make<first,second>::value; 


     int _tmain(int argc, _TCHAR* argv[]) 
    { 
     //cout << Make<1,2>::value << '\n';//UNCOMMENT THIS AND SEE WHAT I MEAN 
     cout << Real<1,2>::value; 
     return 0; 
    } 

S'il vous plaît voir le commentaire 4 lignes ci-dessus.

+0

Pourquoi est-ce que j'ai été déprécié? N'est-il pas acceptable de poser une question sur un sujet avec lequel vous avez des problèmes? –

+0

Il serait probablement utile de lister les résultats réels et attendus, ainsi que le compilateur utilisé. – SCFrench

+2

Non, c'est parce que votre question n'est pas claire. Si vous avez dit '// commentez ceci pour reproduire le problème', cela aurait du sens. le code tel qu'il est fonctionne bien. –

Répondre

1

Cela fonctionne pour moi avec deux coups secs, enlever les décélérations TypeName redondants:

template<int first, int second> 
typename Real<first,second>::type typename Real<first,second>::value = typename Make<first,second>::value; 

Devient:

template<int first, int second> 
typename Real<first,second>::type Real<first,second>::value = Make<first,second>::value; 

(au moins dans gcc 4.4.4)

Le résultat est 1.2, 1.2 - qui est comme prévu (?)

+0

@Nim mais avez-vous essayé de compiler le code avec juste <1,2> :: value? –

+0

Quand je commente la première ligne dans main() je reçois 0. Si je pars les deux, je reçois 1.2 1.2 –

+1

@There & Armen .., erm, pour ma défense, la ligne commentaire/commentaire n'était pas très claire, selon Votre réponse à la question initiale est correcte, mais maintenant que vous l'avez clarifiée, oui, cela a plus de sens ... un peu sévère sur le vote négatif ... peu importe ... – Nim

4

Ce n'est pas prêt à compiler (vous ne vous typename où vous attendez un nom de variable). Après avoir résolu ces choses, je reçois 1.2 pour les deux:

http://codepad.org/z3UCiOfK

http://codepad.org/66xnnLbd

Edit: Il ne fonctionne pas dans VS 2005. Cela doit être un problème dans VC++ (au moins en 2005). C'est probablement lié à la façon dont ils effectuent certains traitements de modèles plus tard que la norme ne l'exige. C'est juste une supposition, cependant.

+0

merci pour une correction. –

+0

Pourquoi m'as-tu déprécié? –

+1

Je ne vous ai pas déprécié, mais je suppose que c'est le lien du code. Il suffit de coller le code dans la réponse - SO a assez bon affichage du code. –

2

Si vous appelez réel < 1,2> :: valeur avant d'appeler Make < 1,2> :: valeur, il est initialisé en premier, donc il devient Make < 1,2> :: initial de la valeur non initialisée value, 0.

Si vous appelez Make < 1,2> :: value d'abord, il est initialisé correctement avec la fonction make(), il obtient la valeur 1.2. Puis, puisque le Real < 1,2> :: value est initialisé par la suite, il obtient cette valeur.

Questions connexes