簡體   English   中英

為什么我得到零?

[英]Why am I getting zero?

在此代碼中(准備編譯):

      #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行。

還沒有准備好進行編譯(在期望變量名的地方不要使用typename )。 解決這些問題后,兩者的1.21.2

http://codepad.org/z3UCiOfK

http://codepad.org/66xnnLbd

編輯:在VS 2005中不起作用。這一定是VC ++中的問題(至少在2005年如此)。 這可能與他們在標准要求之后如何進行某些模板處理有關。 不過,這只是一個猜測。

如果在調用Make <1,2> :: value之前調用Real <1,2> :: value,它將首先被初始化,因此它將獲得Make <1,2> :: value的初始未初始化值,即0。

如果首先調用Make <1,2> :: value,則使用make()函數對其進行正確初始化,它將獲得值1.2。 然后,由於Real <1,2> :: value之后被初始化,因此它將獲得該值。

這對我來說有兩個調整,刪除了多余的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-符合預期(?)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM