вызов функции шаблона базового класса шаблона

Возможный дубликат:
Где и почему мне нужно поместить ключевые слова шаблона и typename?

Вот код:

template<typename T>
class base
{
public:
    virtual ~base();

    template<typename F>
    void foo()
    {
        std::cout << "base::foo<F>()" << std::endl;
    }
};

template<typename T>
class derived : public base<T>
{
public:
    void bar()
    {
        this->foo<int>(); // Compile error
    } 
};

И при запуске:

derived<bool> d;
d.bar();

Я получаю следующие ошибки:

error: expected primary-expression before ‘int’
error: expected ‘;’ before ‘int’

Мне известны независимые имена и двухфазный вид - взлетов. Но когда сама функция является функцией-шаблоном (функция foo<>() в моем коде), я пробовал все обходные пути только безуспешно.


person Daniel K.    schedule 15.02.2012    source источник


Ответы (2)


foo является зависимым именем, поэтому поиск на первом этапе предполагает, что это переменная, если вы не используете ключевые слова typename или template, чтобы указать иное. В этом случае вам нужно:

this->template foo<int>();

См. этот вопрос, если вам нужны все кровавые подробности.

person Mike Seymour    schedule 15.02.2012
comment
Спасибо! действительно спас мой бекон сегодня - person Jacko; 19.12.2013

Делать это нужно так:

template<typename T>
class derived : public base<T>
{
public:
    void bar()
    {
        base<T>::template foo<int>();
    } 
};

Вот полный компилируемый пример:

#include <iostream>

template<typename T>
class base
{
public:
    virtual ~base(){}

    template<typename F>
    void foo()
    {
        std::cout << "base::foo<F>()" << std::endl;
    }
};

template<typename T>
class derived : public base<T>
{
public:

    void bar()
    {
        base<T>::template foo<int>(); // Compile error
    }
};

int main()
{
  derived< int > a;
  a.bar();
}
person BЈовић    schedule 15.02.2012