Странный параметр шаблона шаблона, ожидаемая ошибка

При попытке скомпилировать этот кусок кода:

template <class URNG>
struct Dumb : Brain<Dumb, URNG>
{
    Move operator()(const Rat<Dumb, URNG>& rat, URNG&& urng)
    {
        Move move;
        move.x = 1;
        move.y = 0;
        //rat.look(1, 2);
        //rat.getDna(35);
        return move;
    }
};

clang 3.2.7 поднять, эту странную ошибку я не понимаю:

main.cpp:10:28: error: template argument for template template parameter must be a class template or type alias template
        Move operator()(const Rat<Dumb, URNG>& rat, URNG&& urng)
                                  ^

Тупой шаблон класса не так ли?

Как спросили в комментариях, вот как выглядит крыса:

template <template <class> class BRAIN, class URNG>
class Rat
{
//...
}

1 ответ

Решение

Ваша проблема из-за введенных имен:

template <class URNG>
struct Dumb : Brain<Dumb, URNG>
{
    // in here, "Dumb" refers to the complete type "Dumb<URNG>"
    Move operator()(const Rat<Dumb, URNG>& rat, URNG&& urng)
                          //  ^^^^ 
                          //  really a type, not a template

Чтобы это исправить, вам нужно сослаться на не введенное имя, что вы можете сделать следующим образом:

template <class URNG>
struct Dumb : Brain<Dumb, URNG>
{
    Move operator()(const Rat<::Dumb, URNG>& rat, URNG&& urng)
                          //  ^^^^^^
                          //  actual Dumb<T> template, not type
Другие вопросы по тегам