【问题标题】:operator () overload with template C++使用模板 C++ 的 operator() 重载
【发布时间】:2009-06-14 05:54:15
【问题描述】:

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

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

它有效。感谢所有回复。

【问题讨论】:

    标签: c++ templates overloading


    【解决方案1】:

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

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

    【讨论】:

    • 我不希望它是隐式的,但我想避免整个班级使用模板。如果我使用成员模板进行转换并且调用是显式的,即使那样它也不起作用。
    • 这是唯一的方法:codepad.org/m6L1Ggo2 考虑重新设计您的程序。
    • 哇!非常感谢。事实上,它在没有演员阵容的情况下工作
    【解决方案2】:

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

    这是您需要的吗?

    【讨论】:

    • 感谢您的回答,但我想实现 operator() 的原因是我有一个模板化类,它使用 get 和 set 方法访问基于统一接口的简单数据结构。然后根据使用情况更改数据结构中访问的元素而不影响实现。
    【解决方案3】:

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

    模板 T operator () () const { 先返回; }

    因为

    int i = obj();
    

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

    【讨论】:

      【解决方案4】:

      你试过int i = obj&lt;int&gt;();吗?

      【讨论】:

      • 是的,我做到了。这是明确的?我想我认为隐式行不通。
      • 那是因为您将模板应用于运算符重载而不是类。
      • 您的意思是不允许这样使用?还是有办法解决它?
      • fadini:编译器只能通过查看调用它的参数类型来计算(隐式推断)模板参数(如 T)。它从不查看函数体。
      • 道格:我明白了。就这样我完全清楚,你是说显式也不应该工作?即 int i = obj(); // 这不起作用
      【解决方案5】:

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

      【讨论】:

      • 在这个类中,我总是返回一个 int,但在我调用它的地方,我有函数调用 obj() 或 obj() 这是一个通用调用,即它可以是另一个类首先作为浮动或其他东西。我想尽量保持通话界面不变,不参考数据。
      猜你喜欢
      • 2018-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多