LINUX.ORG.RU

Явное указание параметра шаблона

 ,


0

2

Что-то я завис. Есть такой псевдокод:

class Alloc
{
public:
    template<class T>
    static T* alloc()
    {
        return new T();
    }
};

template<class T, class TAlloc = Alloc>
class Foo
{
public:
    void foo()
    {
        T* t = TAlloc::alloc<T>(); // error there
    }
};

int main(int argc, char *argv[])
{
    Foo<int> f;
    f.foo();
}

собственно ругается где указано выше, говорит

expected primary-expression before '>' token

при этом, если

  • поменять TAlloc на Alloc (явное указание класса) - все работает
  • не указывать <T>, то говорит что не может вывести тип для T, и alloc() не объявлен как следствие.

Чувствую что надо где-то поколдовать с typename но не знаю где и как. Подскажите плиз, если можно с пояснением что, как и почему (ссылка на страницу умной книжки тоже сойдет).

★★★★★

TAlloc::template alloc<T>();
anonymous ()
Ответ на: комментарий от anonymous

спасибо, анонимный брат. вопрос решен. почему так - в принципе и сам немного догоняю.

попутно нашел баг в парсере QtCreator'a, стабильно падает при разборе несуразицы типа

(typename TAlloc)::alloc();

пойду постить.

dib2 ★★★★★ ()
$ clang++ -c template.cpp
template.cpp:17:24: error: use 'template' keyword to treat 'alloc' as a dependent template name
        T* t = TAlloc::alloc<T>(); // error there
                       ^
                       template
1 error generated.

Не благодари.

annulen ★★★★★ ()
Ответ на: комментарий от anonymous

Что это? Он какой-то бесконечный, этот C++, постоянно узнаю что-то новое.

anonymous ()
Ответ на: комментарий от anonymous

Он какой-то бесконечный, этот C++, постоянно узнаю что-то новое.

Страуструп тоже так говорит.

yoghurt ★★★★★ ()
Ответ на: комментарий от anonymous

Указание того, что alloc является шаблоном. Иначе компилятор не в состоянии понять, что ты имеешь в виду(поскольку TAlloc является параметром шаблона, компилятор не знает, что за ним скрывается).

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.