2009-06-14 13 views
7

tengo una clase simple por lo que quiero sobrecargar el operador de la siguiente maneraoperador() de sobrecarga con la plantilla de C++

class MyClass 
{ 
    public: 
     int first; 

     template <typename T> 
     T operator()() const { return first; } 
}; 

Y el en otro lugar que tienen

MyClass obj; 

int i = obj(); // This gives me an error saying could not deduce 
       // template argument for T 

Puede alguien ayudarme con esto error, muy apreciado Gracias.

edición:

Esto tiene algo que ver con el operador(), por ejemplo, si se sustituye la función con

template <typename T> 
    T get() const { return first;} 

funciona. Apreciar todas las respuestas.

Respuesta

5

Si desea que la llamada a la función de ser implícita a continuación, tendrá que aplicar la plantilla a la clase como esta:

template <typename T> 
class MyClass 
{ 
    public: 
    T first; 

    T operator()() const { return first; } 
}; 

Si cabe fundido a otro tipo, entonces debería ser:

template <typename T> 
class MyClass 
{ 
    public: 
    T first; 

    template <typename U> 
    U operator()() const { return (U)first; } 
}; 
+0

No quiero que sea implícita, pero quiero evitar el uso de la plantilla para toda la clase. Si lo lanzo usando una plantilla de miembro y la llamada es explícita, incluso entonces no funciona. –

+0

Muéstrame el código actual usando codepad.org –

+0

http://codepad.org/E30yRqTU –

0

¿Has probado int i = obj<int>();?

+0

Sí, lo hice. Esto es explícito? Creo que implícito no funcionará. –

+1

Eso es porque usted aplicó la plantilla a la sobrecarga del operador y no a la clase. – SingleNegationElimination

+0

¿Quiere decir que este uso no está permitido? o hay una forma de evitarlo? –

0

No estoy seguro de por qué esta es una plantilla en primer lugar, siempre devuelve un int, ¿verdad? Gracias

+0

En esta clase siempre devuelvo un int, pero cuando lo llamo tengo la función call obj() u obj () que es una llamada genérica, es decir, puede ser a otra clase con primero como flotar o algo más. Quiero intentar mantener la misma interfaz de llamada sin consultar los datos. –

1

compilador se enfrentaría a una bastante una ambigüedad cuando se trata de deducir argumentos de plantilla de código como este

plantilla operador T()() const {return primera; }

porque para

int i = obj(); 

T puede ser no sólo int, pero cualquier tipo "moldeable" a int.

3

Lo que quiere hacer es proporcionar un convector genérico de Datos a userType. Considere algo como esto:

#include<iostream> 
#include<string> 
using namespace std; 
class Data{ 
    public: 
     std::string str; 
     double var; 

     template <typename UserType> 
     operator UserType() const { return UserType(var);} 
}; 

int main() 
{ 
Data d; 
d.var = 5.5; 
cout << int(d); 
cout<<"\n"; 
return 0; 
} 

¿Es esto lo que usted necesita?

+0

Gracias por la respuesta, pero la razón por la que quería implementar el operador() fue que tengo una clase de plantillas que accede a una estructura de datos simple basada en una interfaz uniforme que usa los métodos get y set. Luego, dependiendo del uso, cambie el elemento accedido en la estructura de datos sin afectar la implementación. –