2011-08-05 9 views
1

に私はVS2010で、以下のプログラムをコンパイルすることができません。無限にコンパイルして、利用できないヒープになった。どんな助けでも大歓迎です。あなたはこのインナーテンプレートをインスタンス化コンパイルC++のメタプログラムは、VS2010

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(); 

問題は、あなたが部分的に定義されたことがないということです私は問題があなたのテンプレートコードであると信じて

#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

ループカウンタがある値(例えば、ゼロ)に達したときに終了するloop_tの特殊化です。したがって、コンパイラは、より多くのバージョンのloop_tをインスタンス化し続けますcountの値の下限と下限値が内部制限値に達してエラーが報告されます。これを修正するには、カウンタは、いくつかの値(おそらくゼロ)当たったときに停止するloop_tの部分特殊化を導入すべきである:

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

は、この情報がお役に立てば幸い!

+0

これは正しいです。メタプログラミングは再帰を高度に使用し、再帰と同様に、常にループ終端が必要です。 – DanDan

+0

ありがとうございました。 – Rajamohan

関連する問題