【问题标题】:Operator '=' must be a nonstatic member function error运算符'='必须是非静态成员函数错误
【发布时间】:2015-04-10 13:34:06
【问题描述】:

我正在尝试实现以下运算符:

void operator=(const mpz_t &a, const myDatatype &b);

我需要此运算符将变量从 myDatatype 转换为 GMP 中的 mpz_t(mpz_t x = y,其中 y 的数据类型为 myDatatype)。在头文件中,我在类之外声明了这个函数。但是,我里面还有一些其他的 '=' 运算符声明,因为我想将其他数据类型的变量转换为 myDatatype

class myDatatype {

public:
    //variable, constructors and destructor declaration
    ...



    void operator=(const mpz_t &a);
    void operator=(const myDatatype &a);

    //some methods

};

void operator=(const mpz_t &a, const myDatatype &b);

我得到的错误是:

error: ‘void operator=(const __mpz_struct (&)[1], const myDatatype&)’ must be a nonstatic member function
void operator=(const mpz_t &a, const myDatatype &b);

我读到“二元运算符应由具有一个参数的非静态成员函数或具有两个参数的非成员函数实现”,我认为这就是我正在做的事情。我该如何解决这个问题?

【问题讨论】:

  • A binary operator shall be implemented either by a non-static member function with one parameter or by a non-member function with two parameters 这不适用于operator=。正如编译器正确指出的那样,operator= 必须是非静态成员函数。 “正常”二元运算符通常是对称的 - 您通常希望 myObj + 4242 + myObj 都可以工作。但分配不是 - myObj = 42; 有意义,但 42 = myObj 没有那么多。
  • 从给定的用例看来,您确实想实现一个采用const myDatatype&mpz_t 构造函数。
  • @IgorTandetnik 好的,谢谢。然后,我想我必须将它作为一个函数来实现。
  • @Henrik 是的,这就是我想要做的,但我不能为此更改 mpz_t 类,所以我尝试在我的类中作为运算符实现它。

标签: c++ class operator-overloading non-static


【解决方案1】:
void operator=(const mpz_t &a, const myDatatype &b);

这是无效的。 operator= 必须是编译器所说的非静态成员函数。

如果mpz_t 是外部类型(不能修改),最好的选择是定义转换运算符:

class myDatatype
{
public:
    operator mpz_t() const
    {
        //return mpz_t object constructed from *this
    }
};

然后,您可以使用以下语法:

myDatatype my_object = ...;
mpz_t mpz_t_object = my_object;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    • 2010-10-26
    • 2016-05-29
    • 2012-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多