Где и почему я должен поставить ключевые слова "template" и "typename"?

#include <iostream>
#include <string>
using namespace std;

void printstr( const string & s ) { cout << s << endl; }

template < typename A >
class Test
{
public:
    typedef void (*Func)( const A & );
};

typedef void (*Func)( const string & );

template < typename A >
void bind(
        Test< A >::Func f,           //<---- does NOT compile
        //Func f,                    //<---- compiles & works!
        //void (*f)( const A & ),    //<---- compiles & works!
        const A & a) { f( a ); }


int main( )
{
    bind( printstr, string("test") );
    return 0;
}

веденном выше коде я пытаюсь использовать указатель на функцию typedef из другого класса. Как показано, он не компилируется, но с двумя другими строками без комментария вместоTest< A >::Func f, строка, это прекрасно компилируется! Это то, что я не могу сделать в C ++? Какой синтаксис нужен?

Используя g ++ 4.4.3, я получаю

test.cpp:20: error: variable or field "bind" declared void
test.cpp:20: error: expected ")" before "f"
test.cpp:23: error: expected primary-expression before "const"

Ответы на вопрос(1)

Ваш ответ на вопрос