2011-08-05 45 views
1

我無法在VS2010中編譯以下程序。保持編譯無盡並進入堆不可用。任何幫助深表感謝。編譯VS2010中的C++元程序

#include <iostream> 

class function_t 
{ 
public: 
    virtual void operator()()=0; 
}; 

class greet_t : public function_t 
{ 
public: 
    virtual void operator()(){ std::cout << "hello world" << std::endl;} 
}; 

template<int count, function_t** f> class loop_t 
{ 
public: 
    static inline void exec() 
    { 
     (*(*f))(); 
     loop_t< count-1, f>::exec(); 

    } 
}; 

function_t* f; 
int _tmain(int argc, _TCHAR* argv[]) 
{ 
    f = new greet_t(); 
    loop_t<1, &f>::exec(); 

    return 0; 
} 

回答

6

我相信這個問題是在你的模板代碼:

template<int count, function_t** f> class loop_t 
{ 
public: 
    static inline void exec() 
    { 
     (*(*f))(); 
     loop_t< count-1, f>::exec(); 

    } 
}; 

請注意,您實例化這個模板內:

loop_t< count-1, f>::exec(); 

的問題是,你從來沒有定義的部分loop_t專門化,當循環計數器達到某個值(比如零)時終止,所以編譯器只是繼續實例化更多版本的loop_tcount的值更低和更低,直到達到內部限制並報告錯誤。爲了解決這個問題,您應該引入一個局部特殊化的loop_t當計數器命中一定的價值,停止(可能是零):

template<function_t** f> class loop_t<0, f> 
{ 
public: 
    static inline void exec() 
    { 
     // Empty 
    } 
}; 

希望這有助於!

+0

這是正確的。元編程高度遞歸使用,和遞歸一樣,您總是需要一個循環終止符。 – DanDan

+0

非常感謝。 – Rajamohan