2010-11-30 8 views
4
#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; 
} 

Dans le code ci-dessus, j'essaie d'utiliser un pointeur de fonction typedef d'une autre classe. Comme indiqué, il ne compile pas, mais avec l'une des deux autres lignes décommentées au lieu de la ligne Test<A>::Func f,, il compile bien! Est-ce quelque chose que je ne peux pas faire en C++? Quelle syntaxe est nécessaire?La fonction membre modèle typedefs ne compilera pas

Avec g ++ 4.4.3, je reçois

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" 
+2

[Cette réponse] (http://stackoverflow.com/questions/610245/document-de-la-template-et-typename-on-dependent-names/613132#613132) par Johannes à une question connexe expliquera tout ce qu'il y a à savoir sur les noms 'typename' et dépendants, puis un peu plus. – sbi

Répondre

Questions connexes