2015-06-28 124 views
0

我想重载我的模板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; 
    }; 

}; 

完成投入过载为+ = opperator我得到很多下列错误:

错误C2805:二进制 '操作符+ =' 太少参数

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

错误C2334:在'{'之前的意外标记(s)跳过明显的功能体。

错误C2238:在';'之前的意外标记(s)

语法错误:缺少';' '<'

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

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

错误C2059:语法错误: '回归'

错误C2059:语法错误: '对'

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

的,为什么解释或者这些错误如何实际上由我做错的事情引起的可能是有用的。谢谢

+0

那么,主要的错误是,'+ ='实际上分别作为运算符'+'和'='。 'a + = b'与'a = a + b'相同,所以你应该实现'operator +',如果需要'operator ='。 –

+2

'operator + ='必须作为一个参数的成员函数实现,或者一个非成员采用两个参数。您试图将其作为一个非成员来执行一个参数:因此“参数太少”错误。把'朋友'放在前面。 –

+1

@ZachP:恰恰相反,我会说(如果我正确理解你的话)。 'operator +'应该用'operator + ='来实现。 –

回答

0

我能够通过从+ =运算符定义之前删除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 
    } 
}; 

这是+和+ = opperators应该如何超载。

+0

'operator <<'必须作为非成员函数来实现; “朋友”就是如此。 'operator + ='可以作为非成员来实现 - 但是它应该有两个参数。你的只有一个,这只有在它是一个成员函数时才有效。滴下'朋友'就是这么做的。 –

+0

谢谢,现在听起来很愚蠢,但我还没有发布函数不能成为朋友和班级成员的真正意义。 –

+0

那么,你可以让一个类的成员函数成为另一个类的一个朋友。但这不是你的代码所做的。 –