编译c++元程序在VS2010

Compile C++ Meta Program in VS2010

本文关键字:VS2010 程序 c++ 编译      更新时间:2023-10-16

我无法在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;
}

我相信问题出在你的模板代码中:

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_t版本,count的值越来越低,直到达到内部限制并报告错误。为了解决这个问题,您应该引入loop_t的部分专门化,以便在计数器达到某个值(可能为零)时停止:

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

希望这对你有帮助!