Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Call to function is ambiguous in C++. Candidate functions are the Prototype and the function itself

I am working through Stanford CS106B C++ assignments and I have a 'semantic issue' with an assignment.

It seems as if the compiler cannot deduce whether the call is to a function or to the prototype of the function. I don't understand why a call would ever be made to the prototype. How can I make it so that the call is made to the function rather than the prototype? The error message I get it "Call to 'humansTurn' is ambiguous".

The error messages relate to the calls of the humansTurn(Lexicon,Lexicon) function, within the humansTurn(Lexicon,Lexicon) function, at the bottom of the page. The prototype for this function is above the main function.

Any help would be greatly appreciated.

Kind regards,

Mehul

    /*
     * File: Boggle.cpp
     * ----------------
     */

    #include <iostream>
    #include "gboggle.h"
    #include "graphics.h"
    #include "grid.h"
    #include "vector.h"
    #include "lexicon.h"
    #include "random.h"
    #include "simpio.h"
    using namespace std;

    /* Constants */

    const int BOGGLE_WINDOW_WIDTH = 650;
    const int BOGGLE_WINDOW_HEIGHT = 350;

    const string STANDARD_CUBES[16]  = {
       "AAEEGN", "ABBJOO", "ACHOPS", "AFFKPS",
       "AOOTTW", "CIMOTU", "DEILRX", "DELRVY",
       "DISTTY", "EEGHNW", "EEINSU", "EHRTVW",
       "EIOSST", "ELRTTY", "HIMNQU", "HLNNRZ"
    };

    const string BIG_BOGGLE_CUBES[25]  = {
       "AAAFRS", "AAEEEE", "AAFIRS", "ADENNN", "AEEEEM",
       "AEEGMU", "AEGMNN", "AFIRSY", "BJKQXZ", "CCNSTW",
       "CEIILT", "CEILPT", "CEIPST", "DDLNOR", "DDHNOT",
       "DHHLOR", "DHLNOR", "EIIITT", "EMOTTT", "ENSSSU",
       "FIPRSY", "GORRVW", "HIPRRY", "NOOTUW", "OOOTTU"
    };

    /* Function prototypes */

    void welcome();
    void giveInstructions();
    // Create random board
    static Grid <char> randomBoard();
    // Create custom board
    static Grid<char> customBoard();
    static void drawAndFillBoard(Grid<char>);
    static void humansTurn(Lexicon,Lexicon);

    int main() {
        initGraphics(BOGGLE_WINDOW_WIDTH, BOGGLE_WINDOW_HEIGHT);
        welcome();
        giveInstructions();
        string custom = getLine("Type y to create custom board:" );
        Grid<char> gridData;
        if (custom=="y"){
            gridData = customBoard();
        } else {
            gridData = randomBoard();
            }
        drawAndFillBoard(gridData);
        Lexicon english("EnglishWords.dat");
        // Lexicon holds words previously encountered
        Lexicon previousWords;
        humansTurn(english, previousWords);
        return 0;
    }

    /*
     * Function: welcome
     * Usage: welcome();
     * -----------------
     * Print out a cheery welcome message.
     */

    void welcome() {
       cout << "Welcome!  You're about to play an intense game " << endl;
    }

    /*
     * Function: giveInstructions
     * Usage: giveInstructions();
     * --------------------------
     * Print out the instructions for the user.
     */

    void giveInstructions() {
       cout << endl;
       cout << "The boggle board is a grid onto which I ";
       cout << "or triple your paltry score." << endl << endl;
       cout << "Hit return when you're ready...";
       getLine();
    }

    static Grid<char> randomBoard(){
        Vector<string> standardCubes;
        for(int i = 0; i<16;i++){
            standardCubes.add(STANDARD_CUBES[i]);
        }
        // Shuffle cubes
        for (int i = 0; i < standardCubes.size(); i++) {
            int r = randomInteger(i, standardCubes.size()-1);
            if (i!=r){
                string stringToMove1 = standardCubes.get(i);
                string stringToMove2 = standardCubes.get(r);
                standardCubes.set(r, stringToMove1);
                standardCubes.set(i, stringToMove2);
            }
        }
        // Update grid with random side of cube
        Grid<char> gridData(4, 4);
        int counter = 0;
        for (int columnNo = 0; columnNo <4; columnNo++){
            for (int rowNo = 0; rowNo<4; rowNo++) {
                string s = standardCubes.get(counter);
                int r = randomInteger(0, 5);
                gridData[columnNo][rowNo] = s[r];
                counter++;
            }
        }
        return gridData;
    }

    static Grid<char> customBoard(){
        Grid<char> gridData(4,4);
        string s = getLine("Please enter 16 characters to make up the custom board. Characters will fill the board left to right, top to bottom: ");
        for (int i = 0; i < s.length(); i++) {
            s[i] = toupper(s[i]);
        }
        if (s.length()<16){
            cout << "String has to be 16 characters long, try again" << endl;
            customBoard();
        }
        int i =0;
        for (int columnNo = 0; columnNo <4; columnNo++){
            for (int rowNo = 0; rowNo<4; rowNo++) {
                gridData[columnNo][rowNo] = s[i];
                i++;
            }
        }

        return gridData;
    }

    static void drawAndFillBoard(Grid<char> gridData){
        drawBoard(4, 4);
        for (int columnNo = 0; columnNo <4; columnNo++){
            for (int rowNo = 0; rowNo<4; rowNo++) {
                labelCube(rowNo, columnNo, gridData[rowNo][columnNo]);
            }
        }
    }

    static void humansTurn(Lexicon englishWords, Lexicon &previousWords){
        /*
         Human’s turn (except for finding words on the board). Write the loop that allows the user to enter words. Reject words that have already been entered or that don’t meet the minimum word length or that aren’t in the lexicon. Use the gboggle functions to add words to the graphical display and keep score.
         */

        string humanGuess = getLine("Please enter your guess: ");
        for (int i = 0; i < humanGuess.length(); i++) {
            humanGuess[i] = tolower(humanGuess[i]);
        }
        if (humanGuess.length()<4){
            cout << "Min guess length is four characters" << endl;
            humansTurn(englishWords, previousWords);
        }
        if (!englishWords.contains(humanGuess)) {
            cout << "That word is not English, please try another word" << endl;
            humansTurn(englishWords, previousWords);
        }
        if (previousWords.contains(humanGuess)){
            cout << "That word has already been guessed, please try another word" << endl;
            humansTurn(englishWords, previousWords);
        }
        // check if word can be made using data on board

    }
like image 979
Mehul Avatar asked Jan 27 '13 11:01

Mehul


People also ask

What is ambiguous function call?

You cannot override one virtual function with two or more ambiguous virtual functions. This can happen in a derived class that inherits from two nonvirtual bases that are derived from a virtual base class.

How do you fix an ambiguous call to overloaded function?

There are two ways to resolve this ambiguity: Typecast char to float. Remove either one of the ambiguity generating functions float or double and add overloaded function with an int type parameter.

How to remove ambiguous error in c++?

You can resolve ambiguity by qualifying a member with its class name using the scope resolution ( :: ) operator. The statement dptr->j = 10 is ambiguous because the name j appears both in B1 and B2 .


1 Answers

Your function humansTurn definition has different signature with declaration

function declaration:

static void humansTurn(Lexicon,Lexicon);

Function definition:

static void humansTurn(Lexicon englishWords, Lexicon &previousWords) 
                                                     ^^
                                                     //Here
like image 129
billz Avatar answered Nov 09 '22 06:11

billz