“调用'三角'是模棱两可的”错误

时间:2018-03-28 04:18:05

标签: c++ xcode recursion

#include "rec_fun.h"
using namespace mry2270;

void triangle(ostream& outs, unsigned int m, unsigned int n){
    if (m <= n){
        for (int i = 0; i < m; i++){
            cout<<"*";
        }
        cout<< endl;
        triangle(outs, ++m, n);
    }
    else if (m > n && n >= 0) {

        for (int i = 0; i < n; i++){
            cout<<"*";
        }
        cout<< endl;
        triangle(outs, m, --n);
    }
}

void numbers(ostream& outs, const string& prefix, unsigned int levels){

}

bool bears(int n){
    return 0;
}


int main(int argc, const char * argv[]) {



    return 0;
}

#ifndef rec_fun_h
#define rec_fun_h
#include <iostream>
#include <string>
using namespace std;

//  void triangle(ostream& outs, unsigned int m, unsigned int n)
// Precondition: m <= n
// Postcondition: The function has printed a pattern of 2*(n-m+1) lines
// to the output stream outs. The first line contains m asterisks, the next
// line contains m+1 asterisks, and so on up to a line with n asterisks.
// Then the pattern is repeated backwards, going n back down to m.
/* Example output:
 triangle(cout, 3, 5) will print this to cout:
 ***
 ****
 *****
 *****
 ****
 ***
 */
//
//  bool bears(int n)
// Postcondition: A true return value means that it is possible to win
// the bear game by starting with n bears. A false return value means that
// it is not possible to win the bear game by starting with n bears.
// Examples:
//   bear(250) is true (as shown above)
//   bear(42) is true
//   bear(84) is true
//   bear(53) is false
//   bear(41) is false
//
//  bool bears(int n)
// Postcondition: A true return value means that it is possible to win
// the bear game by starting with n bears. A false return value means that
// it is not possible to win the bear game by starting with n bears.
// Examples:
//   bear(250) is true (as shown above)
//   bear(42) is true
//   bear(84) is true
//   bear(53) is false
//   bear(41) is false

namespace mry2270 {

    void triangle(ostream& outs, unsigned int m, unsigned int n);

    void numbers(ostream& outs, const string& prefix, unsigned int levels);

    bool bears(int n);

}

我正在处理一个递归类并不断收到此错误。知道怎么解决吗?

编辑:这是main.cpp文件

我认为潜在的问题可能在.h文件下,但我不确定。

编辑:我添加了.h文件,并在递归调用中更新了我的参数。我仍然得到“调用'三角形'是模糊的”错误,我现在得到一个“无符号表达式比较&gt; = 0总是为真”错误。

3 个答案:

答案 0 :(得分:0)

为了使此代码触发您提到的错误,必须有一个单独的.selector-wrap { margin: 5px 0 0 0; width: 100%; border: 1px solid; display: flex; justify-content: space-evenly; > div { display: flex; align-items: center; justify-content: center; flex: 1; &.flex-zero { flex: 0; visibility: hidden; &:hover { visibility: visible; //here how to make seperator hidden? } } } } 声明与您在代码中提供的定义冲突 - 例如,具有不同参数类型的前向声明。 / p>

您的代码的真正问题是它会导致堆栈溢出。仔细看看这个调用:

triangle

你知道为什么电话通过triangle(outs, m++, n); trianglem的确切值?如果你说&#34;后增量,&#34;你得到了一个金星作为答案:电话应该使用n来解决这个问题;同样,其他调用中的m+1应更改为n--

此外,您的代码中没有退出递归的路径,因为两个分支最终无条件地调用n-1。您应该将triangle的检查添加为零,并在减法后添加一个返回值(当然,它不能为负值,因为它是n,但您的程序会打印unsigned溢出后会出现大量不需要的星号。

Demo.

答案 1 :(得分:0)

  

致电&#39;三角&#39;是不明确的错误

不,你的n并不含糊,至少从你的例子开始。

但是,triangle有自己的(两个)问题 - 没有终止来停止递归,错误地使用triangleoperator++如下:

operator--

答案 2 :(得分:0)

在标题中,有一个前向声明

namespace mry2270 {
    void triangle(ostream& outs, unsigned int m, unsigned int n);
    ...
}

承诺在某处存在函数mry2270::triangle

cpp文件定义了一个名为triangle的函数。

void triangle(ostream& outs, int m, int n){

请注意名称的不同之处。 triangle不是mry2270::triangle,违反了标头所做的承诺。通常情况下,当链接器寻找mry2270::triangle的实现时,它会被捕获。

如果事情变得奇怪,using namespace mry2270;允许mry2270::triangle被称为triangle。已有triangle,导致编译器报告歧义。

可以通过将命名空间添加到triangle的实现来解决。替换

void triangle(ostream& outs, unsigned int m, unsigned int n) {

void mry2270::triangle(ostream& outs, unsigned int m, unsigned int n) {

通过整理,您可以继续整理其他答案指出的其余错误。