Шаблон двоичного дерева, вызов функции для класса

Ладно, один на один, это мой первый вопрос, так что я прошу прощения, если я не включу всю необходимую информацию при первом входе, но я сделаю все возможное.

Моя проблема с конкретной функцией, которую я пытаюсь написать в main(), которая будет выводить данные из узлов, если их "категория" соответствует категории, в которой выполняется поиск. Я, вероятно, просто возлюсь с синтаксисом, поскольку я все еще довольно новичок в этом. Чтобы было ясно, точная проблема состоит в том, что все вызовы функций, которые я пытался сказать мне, *****"Ни один экземпляр перегруженной функции"BinTree::inOrderTraverse [with Type=CategoryorizedContact]"не соответствует списку аргументов.: (void). Тип объекта BinTree***** Вот соответствующий код main():

#include <iostream>
#include <string>
#include <stdexcept> //invalid_argument
using namespace std;
#include "name.h"
#include "contact.h"
#include "address.h"
#include "BinTree.h"
#include "BinNode.h"
#include "CategorizedContact.h"
#include "Field.h"
#include "htmlfunc.h"
using namespace AddressInfo;
void printMenu();
void printByCat(CategorizedContact&, int);
int getMenuInput();
int validateMenuInput(Field input);
Field printCategoryMenu();
Field categorySelection();

int main()
{

    Address tmpAddress;
    Name tmpName, tmpName2;
    CategorizedContact tmpContact, tmpContact2, itemToRemove;
    BinTree<CategorizedContact> myBook;
    Field tmpString1, categoryIn;
    int menuOption = 0, node = 0, count = 0, categoryMenuOption = 0, categoryInt = 0;


    CategorizedContact& tmp = tmpContact2; // I was just experimenting with trying to initialize         
                                          //a ref variable here, to make the function call work.


    myBook.readFile("address.csv");

    do
    {
        printMenu();
        menuOption = getMenuInput();
        switch (menuOption)
    {
    case 1:

        cout << "\t***** Add Contact *****\n\n";

        categoryIn = categorySelection(); //Prints Category menu and gets input
        tmpContact.setCategory(categoryIn); //Assigns category choice to tmpContact
        cin >> tmpContact;                 //Gets the rest of the contact info
        myBook.addItem(tmpContact);     //Adds contact to address book

        myBook.writeFile("address.csv", '\n'); //Writes new contact to file
        break;
    case 2:
        cout << "\n\t***** Count Contacts *****\n";
        count = myBook.getNumUsed();
        cout << "Number of Contacts: " << count;
        cout << endl << endl;
        break;
    case 3:
        cout << "\n\t***** Print Contacts By Category *****\n";
        categoryIn = printCategoryMenu(); //Prints category menu and gets choice
        if (categoryIn == "All Contacts") 
            myBook.printAll();
        categoryInt = stoi(categoryIn); // converts to int to match required function parameters

        myBook.inOrderTraverse(printByCat(tmp, categoryInt));
        break;

Эта последняя строка перед перерывом; это вызов функции, с которой я борюсь. Вот это объявление:

void printByCat(CategorizedContact& tmp, int categoryInt)
{
    int count = 1;
    switch (categoryInt)
    {
    case 65:
        if (tmp.getCategory() == "Business")
            cout << count << ". " << tmp << endl;
        break;
    default:
        cout << "Error" << endl;
        break;
    }
}

Он не закончен, и, возможно, даже не спроектирован правильно, но я не могу сказать, пока мне не удастся заставить вызов функции работать. Наконец, вот соответствующий код из моих файлов inOrderTraverse .h и.tem, имеющих отношение к проблеме.

#ifndef BINTREE_H
#define BINTREE_H
#include <cstdlib> // NULL
#include <string>
#include <iostream> // cout
#include <fstream>
#include <algorithm> // copy
#include "BinNode.h" 
#include "CategorizedContact.h"
#include "Contact.h"
template <class Type>
class BinTree
{
public:
    BinTree();
    BinTree(const BinTree<Type>& source);
    ~BinTree();
    BinTree<Type>& operator=(const BinTree<Type>& source);//assignment operator
    int getNumUsed() const { return(used); }

    void addItem(Type dataIn);

    void printAll();
    void writeFile(string fileName, char delimeter = '\n');
    void readFile(string fileName);
    void inOrderTraverse(void process(Type&, int));
    void debugOn() { debug = true; }
    void debugOff() { debug = false; }

private:
    bool debug;
    int used;
    BinNode<Type>* root;
    void inOrderTraverse(void process(Type&, int),
    BinNode<Type>* cursor, int& count);
    void write(BinNode<Type>* cursor, char delimeter,
    ofstream& outFile);
    void printInOrder(BinNode<Type>* cursor, int& count);
    void free(BinNode<Type>* cursor);
    void copyTree(BinNode<Type>* cursor);
    BinNode<Type>* alloc(Type itemToAdd);
};
#include "BinTree.tem"

И только соответствующие.tem порции...

template <class Type>
void BinTree<Type>::inOrderTraverse(void process(Type&, int))
{
    int count = 1;
    inOrderTraverse(process, root, count);
}
template <class Type>
void BinTree<Type>::inOrderTraverse(void process(Type&, int),
    BinNode<Type>* cursor, int& count)
{
    if (cursor != NULL)
    {
        // In order traverse
        inOrderTraverse(process, cursor->left, count);
        // PROCESS
        process(cursor->data, count);
        count++;
        inOrderTraverse(process, cursor->right, count);
    }
}

Прежде чем кто-либо предложит изменить InOrderTraverse(процесс void (Type&, int)) или перегруженную версию, просто знайте, что я должен реализовать его таким образом для моего проекта. единственная свобода, которую я имею, это ***printByCat(CategoryorizedContact, int)****, которую можно изменить, если она все еще совместима с inOrderTraverse. Так что, как я надеюсь, вы теперь можете видеть, функция в main() printByCat() предназначена для получения категории от пользователя, а затем служит самим аргументом для inOrderTraverse(printByCat()). но я явно совершаю фундаментальную ошибку, которую не понимаю.

На данный момент любые указания будут оценены, я не прошу никого делать кодирование для меня, поскольку я знаю, что вы против этого, но мне просто нужно понять, почему не работает вызов функции. Я предполагаю, что проблема связана с моим отсутствием опыта работы со ссылочными переменными, но я получаю сообщение об ошибке, указывающее на то, что функция printByCat (), принимаемая в качестве аргумента inOrderTraverse, не соответствует требованиям аргумента, поскольку она не соответствует пустая функция, но это пустая функция.... так что да, я немного растерялся. В любом случае, спасибо за ваше время, и, пожалуйста, дайте мне знать, если я что-то забыл.

1 ответ

Выяснил, что это было, по-видимому, я не могу включить аргументы printbyCat() при использовании этой функции в качестве аргумента inOrderTraverse(), поэтому вызов функции должен был быть просто: myBook.inOrderTraverse(printByCat).

Другие вопросы по тегам