Компиляция метапрограммы C ++ в VS2010 - PullRequest
1 голос
/ 05 августа 2011

Я не могу скомпилировать приведенную ниже программу в 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 Ответ

6 голосов
/ 05 августа 2011

Мне кажется, проблема в коде вашего шаблона:

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

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...