2011-02-11 4 views
11

Estoy intentando crear una clase de plantilla que almacene un puntero a una función de plantilla, pero me encontré con un error de compilación en Visual Studio 2008. Creé un caso de prueba simplificado para ello (ver más abajo) que aún no se compila en VS2008, pero pareció compilarse con éxito en el Comeau en línea y en los compiladores de GCC en línea que probé.Error de compilación con función de puntero a plantilla en Visual Studio 2008

El error que estoy viendo es:

error C2436: 'func' : member function or nested class in constructor initializer list 
temp.cpp(21) : while compiling class template member function 'test_class<T>::test_class(T (__cdecl &))' 
1>  with 
1>  [ 
1>   T=int (const int &) 
1>  ] 

La misma prueba utilizando una plantilla no funciona la función. A falta de eso, ¿alguien sabe una solución para el problema, o si VS2008 espera algún tipo de sintaxis diferente para esto?

Gracias,

Jerry

template<class T> 
T template_function(const T& arg) 
{ 
    return arg; 
} 

int non_template_function(const int& arg) 
{ 
    return arg; 
} 

template<class T> 
class test_class 
{ 
public: 
    test_class(const T& arg) : func(arg) {} 
private: 
    T func; 
}; 

template<class T> 
void create_class(const T& arg) 
{ 
new test_class<T>(arg); 
} 

int main() 
{ 
    create_class(&template_function<int>); //compile fails unless this is commented out 
    create_class(&non_template_function); 
    return 0; 
} 
+0

+1 para la pregunta, bien escrito, buen ejemplo de trabajo mínimo. No se puede responder con autoridad pero __cdecl en el mensaje de error establece el timbre de alarma con respecto a la vinculación. – Flexo

Respuesta

0

Me parece que "const T & arg" en test_class y create_class son su problema. Cambiarlos a un simple "T arg" parece suavizar las cosas.

+0

¡Eso es exactamente, gracias! No tengo idea de por qué falla con la función de plantilla y no con la plantilla, pero con ese cambio funciona para ambos. – Jerry

+0

Se metió en el mismo problema, y ​​esta respuesta lo resolvió. ¡Gracias! –

1

Parece que un error del compilador ya que en realidad piensa que usted está tratando de invocar esa función en lugar de la inicialización.

no tengo VS compilador de C++, pero declarando T como un puntero puede solucionar el problema:

template<class T> 
class test_class 
{ 
public: 
    test_class(const T& arg) : 
     func(&arg) 
    { 
    } 

private: 
    T *func; 
}; 


template<class T> 
void create_class(const T& arg) 
{ 
    new test_class<T>(arg); 
} 

int main() 
{ 
    create_class(template_function<int>); //compile fails unless this is commented out 
    create_class(non_template_function); 
} 
2

Fix en dos lugares;

T* func; //make this pointer type! 

y,

create_class(template_function<int>); //remove '&' 
create_class(non_template_function); //remove '&' 

hecho!

Cuestiones relacionadas