2010-10-28 4 views
1

В этом коде (готовый к компиляции):Почему я получаю ноль?

 #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 строки выше.

+0

Почему я получил нижний план? Разве не нормально задавать вопрос о теме, с которой у вас проблемы? –

+0

Скорее всего, это поможет перечислить фактический и ожидаемый результат, а также использовать компилятор. – SCFrench

+2

Нет, это потому, что ваш вопрос непонятен. Если вы сказали «// прокомментируйте это, чтобы воспроизвести проблему», это будет иметь смысл. код в его нынешнем виде отлично работает. –

ответ

1

Это работает для меня с двумя ухищрений, удалите лишние 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 - как ожидалось (?)

+0

@Nim, но вы пытались скомпилировать код только с Real <1,2> :: value? –

+0

Когда я комментирую первую строчку в main(), я получаю 0. Если я оставлю оба, я получаю 1.2 1.2 –

+1

@There & Armen .., erm, в свою защиту, комментарий/раскол не был очень ясен, согласно ваш исходный ответ на вопрос правильный, однако теперь, когда вы его прояснили, да, это имеет смысл ... как-то суровый на голосу, хотя ... неважно ... – Nim

4

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

http://codepad.org/z3UCiOfK

http://codepad.org/66xnnLbd

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

+0

Спасибо за исправление. –

+0

Зачем ты меня опустил? –

+1

Я не спустил вас вниз, но думаю, это ссылка на кодовое слово. Просто вставьте код в ответ - SO имеет довольно хороший просмотр кода. –

2

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

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

Смежные вопросы