перегрузка operator () с шаблоном C ++ - PullRequest
7 голосов
/ 14 июня 2009

У меня есть простой класс, для которого я хочу перегрузить оператор, как показано ниже

class MyClass
{
   public:
      int first;

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

А где-то еще у меня

MyClass obj;

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

Может кто-нибудь помочь мне с этой ошибкой, высоко ценится. Спасибо.

редактирование:

Это как-то связано с оператором (), например, если я заменю функцию на

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

это работает. Цените все ответы.

Ответы [ 5 ]

5 голосов
/ 14 июня 2009

Если вы хотите, чтобы вызов функции был неявным, вам придется применить шаблон к классу следующим образом:

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

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

Если оно должно быть приведено к другому типу, тогда оно должно быть:

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

  template <typename U>
  U operator () () const { return (U)first; }  
};
3 голосов
/ 14 июня 2009

Что вы хотите сделать, это предоставить общий конвектор из Data в userType. Рассмотрим что-то вроде этого:

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

Это то, что вам нужно?

1 голос
/ 14 июня 2009

Компилятор столкнулся бы с весьма неоднозначностью при попытке вывести аргументы шаблона из кода, подобного этому

шаблон T operator () () const {return first; }

потому что для

int i = obj();

T может быть не только int, но и любого типа от "castable" до int.

0 голосов
/ 14 июня 2009

Я не уверен, почему это шаблон, вы всегда возвращаете int, верно? Спасибо

0 голосов
/ 14 июня 2009

Вы пробовали int i = obj<int>();?

...