在VS2010中编译C ++元程序

时间:2011-08-05 16:22:23

标签: c++ templates

我无法在VS2010中编译以下程序。保持编译无穷无尽,进入堆不可用。非常感谢任何帮助。

#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;
}

1 个答案:

答案 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的部分特化,当循环计数器达到某个值(比如零)时终止,因此编译器只是继续实例化越来越多的{ {1}} loop_t的值越来越低,直到达到内部限制并报告错误。要解决此问题,您应该引入count的部分特化,以便在计数器达到某个值(可能为零)时暂停:

loop_t

希望这有帮助!