2011-08-05 4 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(); 

문제는 당신이 부분을 정의 적이 있다는 것입니다 루프 카운터가 어떤 값 (예 : 0)에 도달 할 때 종료되는 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

관련 문제