好的只是一个抬头,这是我在这里的第一个问题,所以如果我不在第一次包含所有相关的信息,我道歉,但我会尽我所能。
我的问题在于我尝试在main()中编写的特定函数,如果他们的"类别"将打印出来自节点的数据。匹配搜索的类别。我可能只是在语法上摸索,因为我还是很陌生。要清楚,确切的问题是我试过的所有函数调用告诉我*****"没有重载函数的实例" BinTree :: inOrderTraverse [with Type = CategorizedContact]& #34;匹配参数列表。参数类型是:(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 process(Type&amp;,int))或重载版本之前,只需知道我需要以这种方式为我的项目实现它。 我唯一的自由是*** printByCat(CategorizedContact,int)****,只要它仍然与inOrderTraverse兼容,就可以改变。 所以我希望你现在可以看到,main()printByCat()中的函数意味着从用户那里获取一个类别,然后作为inOrderTraverse(printByCat())的参数本身。但我显然犯了一个我不明白的根本错误。
此时任何指导都会受到赞赏,我并没有要求任何人为我编码,因为我知道你反对,但我真的只需要理解为什么函数调用不是工作。我猜这个问题源于我缺乏参考变量的经验,但我得到的错误似乎表明函数printByCat()被作为inOrderTraverse的参数,不符合论证要求,因为它不是一个无效函数,但它是一个无效函数....所以我很少迷失。无论如何,谢谢你的时间,如果我忘了什么,请告诉我。
答案 0 :(得分:0)
发现它是什么,显然我在使用这个函数作为inOrderTraverse()的参数时不能包含printbyCat()的参数,所以函数调用应该只是:myBook.inOrderTraverse(printByCat)。 / p>