operator()重载模板C ++

时间:2009-06-14 05:54:16

标签: c++ templates overloading

我有一个简单的类,我想重载运算符,如下所示

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

有人可以帮我解决这个错误,非常感谢。谢谢。

编辑:

这与operator()有关,例如,如果我用

替换该函数
    template <typename T>
    T get() const { return first;}

它有效。感谢所有回复。

5 个答案:

答案 0 :(得分:5)

如果您希望函数调用是隐式的,那么您必须将模板应用于类,如下所示:

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

答案 1 :(得分:3)

您要做的是提供从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;
}

这是你需要的吗?

答案 2 :(得分:1)

当尝试从像

这样的代码中推断模板参数时,编译器会面临一个非常模糊的问题

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

因为

int i = obj();

T不仅可以是int,而且任何类型“castable”到int。

答案 3 :(得分:0)

你试过int i = obj<int>();吗?

答案 4 :(得分:0)

我不知道为什么这是一个模板,你总是返回一个int,对吗? 感谢