为什么我会变零?

时间:2010-10-28 12:57:00

标签: c++ templates

在此代码中(准备编译):

      #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 个答案:

答案 0 :(得分:4)

尚未准备好编译(您不希望使用typename您期望的变量名称)。修好这些东西后,我得到1.2两个:

http://codepad.org/z3UCiOfK

http://codepad.org/66xnnLbd

编辑:它在VS 2005中不起作用。这在VC ++中一定是个问题(至少在2005年)。这可能与他们如何在标准要求之后进行某些模板处理有关。但这只是猜测。

答案 1 :(得分:2)

如果在调用Make&lt; 1,2&gt; :: value之前调用Real&lt; 1,2&gt; :: value,它会先被初始化,因此它会获得Make&lt; 1,2&gt; :: value的初始非初始化值,这是0。

如果首先调用Make&lt; 1,2&gt; :: value,则使用make()函数正确初始化它,它获得值1.2。然后,由于Real&lt; 1,2&gt; ::值在之后被初始化,它将获得该值。

答案 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 - 这是预期的(?)