【发布时间】: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