7

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

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

有用。感谢所有的回应。

4

5 回答 5

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; }  
};
于 2009-06-14T06:09:21.720 回答
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;
}

这是你需要的吗?

于 2009-06-14T08:29:00.197 回答
1

当试图从这样的代码中推断出模板参数时,编译器会面临一个相当模糊的问题

模板 T 运算符 () () const { 先返回;}

因为对于

int i = obj();

T 不仅可以是 int,还可以是任何“可转换”为 int 的类型。

于 2009-06-14T07:45:14.513 回答
0

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

于 2009-06-14T06:00:03.487 回答
0

我不确定为什么这是一个模板,你总是返回一个 int,对吧?谢谢

于 2009-06-14T07:01:14.947 回答