2012-02-15 4 views
9

Можно создать дубликат:
Where and why do I have to put the “template” and “typename” keywords?вызова шаблона функции шаблона базового класса

Вот код:

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’ 

Я знаю non-dependent names and 2-phase look-ups. Но, когда сама функция является функцией шаблона (функция foo<>() в моем коде), я пробовал все обходные пути только для отказа.

ответ

19

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

this->template foo<int>(); 

См this question, если вы хотите все окровавленные детали.

+0

спасибо! действительно спас мой бекон сегодня – Jacko

7

Вы должны сделать это так:

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