未处理的异常运算符重载

时间:2015-05-20 19:46:01

标签: c++ class templates

我正在练习运算符重载并构建了一个简单的计算器。

mailchimp

但遗憾的是,当我尝试实现该类时,它会抛出异常:

  

Proctical programming c ++中0x010154C9处的未处理异常   重载1.exe:0xC00000FD:堆栈溢出(参数:0x00000001,   0x00192F64)。

以下是template <class one> class calc { int a; public: calc() : a(0) {}; calc(const calc& other) : a(other.a) {} void print() { cout << a; } calc& operator += (const calc& other); calc& operator += (const one& i); calc& operator -= (const calc& other); calc& operator -= (const one& i); calc& operator *= (const calc& other); calc& operator *= (const one& i); calc& operator /= (const calc& other); calc& operator /= (const one& i); const calc& operator - () const; friend const calc operator + (const calc& our, const calc& other); friend const calc operator + (const one& i, const calc& other); friend const calc operator + (const calc& our, const one& i); };

main

问题出现了,例如,这里,但也发生在其他运营商中:

int main() {
    calc <int> one;
    one += 2;
    one.print();
    cin.get();
}

请你告诉我我做错了什么?

1 个答案:

答案 0 :(得分:1)

您的函数以递归方式调用自身,无条件退出:

template <class one>
calc<one>& calc <one> :: operator += (const one& i) {
    *this += i;
    //    ^calls the function youre currently in.
    return *this;
}

您需要调整+=运算符以使用您已定义的+运算符,或者如@PaulMcKenzie所述,在+=中进行实际添加,并{ {1}}使用+。例如,

+=

似乎有效。

如果警告级别足够高,您可以看到有关此警告:

  

警告1警告C4717:&#39; calc :: operator + =&#39; :在所有控制路径上递归,函数将导致运行时堆栈溢出

话虽如此,您的代码还存在其他一些问题,例如template <class one> calc<one>& calc <one> :: operator += (const one& i) { a += i; return *this; } 应为int a

one a

应该是普通的friend const calc operator + (const calc& our, const calc& other); 运营商,而不是朋友。