在头文件上声明一个类的=和[]运算符,“必须是非静态成员函数”错误

时间:2016-02-17 22:01:13

标签: c++ operator-overloading

我已经创建了一个类Block和一个struct coords,在实现运算符时我想出了错误:

'coords operator[](const Block&, const size_t&)' must be a nonstatic member function
'bool operator=(Block&, const Block&)' must be a nonstatic member function

我已经在Block类的头文件中声明了这两个,如下所示:

class Block
{
  friend Block operator+(const Block&, const coords&);
  friend Block operator+(const Block&, const Block&);
  friend coords operator[](const Block&, const std::size_t&);
  friend void operator+=(Block&, const coords&);
  friend void operator+=(Block&, const Block&);
  friend bool operator=(Block&, const Block&);
//...
};

只有运营商[]和=得到这个错误,我不知道为什么。 我试图改变返回值和参数类型,但它仍然遇到同样的问题。 这两个运营商是否特别?或者我的声明是否有错误? 我已经找到了解决这个问题的方法,但找不到合适的答案。

感谢您的回复。

4 个答案:

答案 0 :(得分:3)

并非所有运算符都可以使用非成员函数进行重载。 []=是两个这样的运营商。它们只能作为成员函数重载。

有关详细信息,请参阅http://en.cppreference.com/w/cpp/language/operators

答案 1 :(得分:1)

这些运营商不能被宣布为朋友。相反,你应该这样声明:

coords operator[](const std::size_t&);
bool operator=(const Block&);

您的运营商也没有真正遵循惯例。运营商+==应返回Block&*this

答案 2 :(得分:0)

原因正是错误消息所说的:这两个必须是非静态成员函数。摆脱它们前面的operator+=并删除第一个参数。

此外,operator+通常也作为成员函数实现,尽管不一定如此。但如果是的话,它会为您提供一种简单的方法来实现{{1}}而不会成为朋友。

答案 3 :(得分:0)

@ R Sahu 的链接很有用,表明[]和=不能被声明为非成员,但它并没有真正解释原因。 @ Baum mit aguen 的链接也清除了其他一些问题。 (感谢您的信息)

因此,我将代码调整为以下新信息:

Block.h

class Block
{
public:
//...
    coords* operator[](size_t);

    Block operator=(Block);
//...
};

Block.cpp

//...
coords* Block::operator[](size_t index)
{
    if(index >= 0 && index < block.size())
        return &block.at(index);
    coords *tmp = new coords(-1, -1);
    return tmp;
}

Block Block::operator=(Block b2)
{
    block.empty();
    block.reserve(b2.block.size());
    append(b2.block);
    return *this;
}
//...

这样您就可以致电*(*b1)[0] = c1; Block* b1coords c1

朋友修饰符对其他类型的实现非常有用,但我之后才意识到内联的实现必须在头文件中完成,不是在cpp上。 Block.h

class Block
{
public:
//...
    friend std::ostream& operator<<(std::ostream&, const Block&);
    friend std::ostream& operator<<(std::ostream&, Block&);
//...
};

inline std::ostream& operator<<(std::ostream& out, const Block& b)
{
    // do something
    return out;
};

inline std::ostream& operator<<(std::ostream& out, Block& b)
{
    // do something
    return out;
};

在这种情况下,您需要传递&#34; 这个&#34;参数必须传递给函数,因为它们是非成员函数,应该在类文件外部的头文件中实现。

我希望这有帮助,对每个人都很好。