Почему я получаю ноль? - PullRequest
1 голос
/ 28 октября 2010

В этом коде (готов к компиляции):

      #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;
    }

Пожалуйста, смотрите комментарий на 4 строки выше.

Ответы [ 3 ]

4 голосов
/ 28 октября 2010

Это не готово к компиляции (вы не используете typename там, где вы ожидаете имя переменной).После исправления этих ошибок я получаю 1.2 для обоих:

http://codepad.org/z3UCiOfK

http://codepad.org/66xnnLbd

Редактировать: в VS 2005 не работалобыть проблемой в VC ++ (по крайней мере, в 2005 году).Вероятно, это связано с тем, как они выполняют определенную обработку шаблонов позже, чем требует стандарт.Это всего лишь предположение.

2 голосов
/ 28 октября 2010

Если вы вызываете Real <1,2> ​​:: value до вызова Make <1,2> ​​:: value, он сначала инициализируется, поэтому он получает начальное неинициализированное значение Make <1,2> ​​:: value , что составляет 0.

Если вы сначала вызовите Make <1,2> ​​:: value, он будет правильно инициализирован с помощью функции make (), он получит значение 1.2. Затем, поскольку Real <1,2> ​​:: value впоследствии инициализируется, оно получает это значение.

1 голос
/ 28 октября 2010

Это работает для меня с двумя твиками, убрать лишние замедления typename:

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

становится:

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

(по крайней мере в gcc 4.4.4)

Результат равен 1,2, 1,2 - что и ожидалось (?)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...