2009-06-14 14 views
7

Mam proste klasy, dla których chcę przeciążać operatora jak poniżejoperator() przeciążenie z szablonu C++

class MyClass 
{ 
    public: 
     int first; 

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

a gdzieś indziej mam

MyClass obj; 

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

Czy ktoś może mi w tym pomóc błąd, bardzo doceniany. Dziękuję Ci.

edit:

To ma coś wspólnego z operatorem(), na przykład jeśli mam wymienić funkcję z

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

to działa. Doceń wszystkie odpowiedzi.

Odpowiedz

5

Jeśli chcesz wywołanie funkcji być niejawna następnie trzeba będzie zastosować szablon do klasy jak ten:

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

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

Jeśli lanego należy do innego typu to powinno być:

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

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

Nie chcę, aby było to niejawne, ale chcę uniknąć użycia szablonu dla całej klasy. Jeśli przesyłaję go przy użyciu szablonu członkowskiego, a wywołanie jest jawne, nawet wtedy nie działa. –

+0

mi pokazać aktualny kod korzystając codepad.org –

+0

http://codepad.org/E30yRqTU –

0

Czy próbowałeś int i = obj<int>();?

+0

Tak, zrobiłem. To jest wyraźne? Myślę, że domyślam się, że nie działa. –

+1

To dlatego, że zastosowałeś szablon do przeciążenia operatora, a nie do klasy. – SingleNegationElimination

+0

Czy masz na myśli, że korzystanie z tej funkcji jest niedozwolone? czy jest jakiś sposób obejścia tego? –

0

Nie jestem pewien, dlaczego to jest szablon, zawsze zwracasz int, prawda? Dzięki

+0

W tej klasie zawsze zwracam int, ale tam, gdzie ją nazywam, mam wywołanie funkcji obj() lub obj (), które jest wywoływaniem ogólnym, tj. Może być do innej klasy z najpierw jako float lub coś innego. Chcę spróbować zachować interfejs wywołania tak samo bez odwoływania się do danych. –

1

Kompilator może napotkać spore niejasności próbując wydedukować argumenty szablon z kodu jak ten

szablonu operatora T()() const {return pierwszy; }

bo

int i = obj(); 

T może być nie tylko int, ale dowolny typu "rzutować" na int.

3

Co chcesz zrobić, to podać ogólny konwektor z Data do typu userType. Rozważmy coś takiego:

#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; 
} 

Czy tego właśnie potrzebujesz?

+0

Dziękuję za odpowiedź, ale powodem, dla którego chciałem zaimplementować operator(), było to, że mam klasę templatyzowaną, która uzyskuje dostęp do prostej struktury danych opartej na jednolitym interfejsie przy użyciu metod pobierania i zestawiania. Następnie, w zależności od użycia, można zmienić dostęp do elementu w strukturze danych bez wpływu na implementację. –

Powiązane problemy