【问题标题】:Overloading template operators重载模板运算符
【发布时间】:2015-09-15 02:27:06
【问题描述】:

我正在尝试在我的模板 Vector 类上重载 += 运算符。

template<unsigned int dimensions, typename TValue>
class Vector
{
private:
    std::array<TValue, dimensions> m_values;
public:
    Vector(){
        for (int i = 0; i < dimensions; i++){
            m_values[i] = TValue();
        }
    };
    Vector(std::array<TValue, dimensions> elements){
        for (int i = 0; i < dimensions; i++){
            m_values[i] = elements[i];
        }
    };
    
    inline void set(VectorDimensions dimension, TValue value){
        m_values[dimension] = value;
    };
    
    inline TValue get(VectorDimensions dimension) const{
        return m_values[dimension];
    };

    inline unsigned int getSize() const{
        return dimensions;
    };

    const std::array<TValue, dimensions> getValues() const{
        return m_values;
    };

    friend ostream& operator<<(ostream& os, const Vector<dimensions, TValue>& vt) {
        array<TValue, dimensions> values = vt.getValues();
        os << '[';
        for (unsigned int i = 0; i < vt.getSize(); i++){
            os << values[i] << values[i+1] ? ", " : "";
        }
        os << ']';
        return os;
    };

    friend Vector<dimensions, TValue>& operator+=(const Vector<dimensions, TValue>& vt) {
        array<TValue, dimensions> values = vt.getValues();
        for (unsigned int i = 0; i < vt.getSize(); i++){
            m_values[i] += values[i];
        }
        return *this;
    };

};

为 += 运算符添加重载后,我收到许多以下错误:

错误 C2805:二进制 'operator +=' 的参数太少

错误 C4430:缺少类型说明符 - 假定为 int。注意:C++ 不支持 default-int

错误 C2334:'{' 之前的意外标记;跳过明显的函数体。

错误 C2238:';' 前面的意外标记

语法错误:缺少';'在'之前

错误 C2143:语法错误:缺少 ';'在'++'之前

错误 C2143:语法错误:在 ';' 之前缺少 ')'

错误 C2059:语法错误:'return'

错误 C2059:语法错误:'for'

错误 C2059:语法错误:')'

解释为什么或如何实际导致这些错误是由我做错了什么可能是有用的。谢谢

【问题讨论】:

  • 嗯,主要的错误是+= 实际上分别充当运算符+ 和=。 a += b 与 a = a + b 相同,因此您应该实现 operator+ 并在必要时实现 operator=。
  • operator+= 必须实现为采用一个参数的成员函数,或采用两个参数的非成员。您尝试将其实现为采用一个参数的非成员:因此出现“参数太少”错误。将friend 放在前面。
  • @ZachP:恰恰相反,我会说(如果我理解正确的话)。 operator+ 应该按照operator+= 来实现。
  • @ChristianHackl 实现operator += 毫无意义。为什么不实现 operator+ 和 operator= 呢?这条线怎么样:a = a + b + c + d,或者甚至a += b + c + d,当它们都属于同一类时。我认为这没有任何意义。注意,错误显然不在这里,我只是讲了代码背后的逻辑。
  • @ZachP:这是为了避免代码重复。 += 是基本构建块,+ 以T result = a; result += other; 的形式使用它(连同=)。

标签: c++ templates operator-overloading


【解决方案1】:

我能够通过从 += 运算符定义之前删除friend 关键字来停止错误。根据这个页面http://en.cppreference.com/w/cpp/language/operators

class X {
 public:
  X& operator+=(const X& rhs) // compound assignment (does not need to be a member,
  {                           // but often is, to modify the private members)
    /* addition of rhs to *this takes place here */
    return *this; // return the result by reference
  }

  // friends defined inside class body are inline and are hidden from non-ADL lookup
  friend X operator+(X lhs,       // passing first arg by value helps optimize chained a+b+c
                    const X& rhs) // alternatively, both parameters may be const references.
  {
     return lhs += rhs; // reuse compound assignment and return the result by value
  }
};

这就是 + 和 += 运算符的重载方式。

【讨论】:

  • operator&lt;&lt; 必须作为非成员函数实现; friend 做到了。 operator+= 可以作为非成员实现 - 但它应该采用两个参数。你的需要一个,只有当它是一个成员函数时才有效。删除friend 就可以了。
  • 谢谢,现在听起来很愚蠢,但我还没有说明函数不能成为朋友和班级成员的真正意义。
  • 好吧,你可以让一个类的成员函数成为另一个类的朋友。但这不是您的代码正在做的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-19
  • 2016-02-03
  • 2018-08-03
  • 2013-02-05
相关资源
最近更新 更多