如何修复使用不同类型参数调用模板函数的程序?
How do I fix my program that calls a template function using parameters of different types?
我无法弄清楚如何调用模板函数,该函数假设将字符串和 College 对象作为我 main.cpp 中的参数。
这是我在 LinkedListADT.h 中的模板:
#ifndef LINKED_LIST_H
#define LINKED_LIST_H
#include "ListNodeADT.h"
template <class T>
class LinkedList
{
private:
ListNode<T> *head;
int length;
public:
LinkedList(); // constructor
~LinkedList(); // destructor
// Linked list operations
void insertNode(const T &);
bool deleteNode(const T &);
bool searchList(const T &, T &) const;
};
这是我目前在 LinkedListADT.h 文件中为搜索功能编写的内容:
template <class T, class S>
bool LinkedList<T, S>::searchList(const S &target, T &dataOut) const
{
bool found = false; // assume target not found
ListNode<T> *pCur;
while (pCur && pCur->getData().getCode() != target){
/*Code to search*/
return found;
}
这是我的 main.cpp 中的搜索功能,它从采用用户输入的大学代码的头文件中调用 searchList。假设使用字符串输入调用 searchList 并尝试在链表中找到与大学代码匹配的项:
void searchManager(const LinkedList<College> &list)
{
string targetCode = "";
College aCollege;
cout << "\n Search\n";
cout << "=======\n";
while(toupper(targetCode[0]) != 'Q')
{
cout << "\nEnter a college code (or Q to stop searching) : \n";
cin >> targetCode;
if(toupper(targetCode[0]) != 'Q')
{
if(list.searchList(targetCode, aCollege))
/*Code to display college*/
else
cout << "Not Found";
}
}
cout << "___________________END SEARCH SECTION _____\n";
}
我确定这不是在头文件中编写模板函数的方法,因为这也会更改其他模板函数(插入、删除等)的模板。我将不胜感激有关正确编写它的方法的任何建议。谢谢大家!
How would I define a template class that could be one or two
parameters? (from a comment)
您可以使用 可变参数模板 来完成此操作,但这不是您需要的。相反,您需要 single-argument 模板 class 的模板成员函数,如下所示:
template <class T>
class LinkedList
{
//...
public:
//...
template<class S>
bool searchList(const S& target, T& result) const;
};
将函数定义放在class里面更容易,但是如果你坚持要在外面定义它,语法如下:
template<class T>
template<class S>
bool LinkedList<T>::searchList(const S& target, T& result) const
{
//...
}
一旦你拥有它,你从 main()
调用它的方式应该编译。
我无法弄清楚如何调用模板函数,该函数假设将字符串和 College 对象作为我 main.cpp 中的参数。
这是我在 LinkedListADT.h 中的模板:
#ifndef LINKED_LIST_H
#define LINKED_LIST_H
#include "ListNodeADT.h"
template <class T>
class LinkedList
{
private:
ListNode<T> *head;
int length;
public:
LinkedList(); // constructor
~LinkedList(); // destructor
// Linked list operations
void insertNode(const T &);
bool deleteNode(const T &);
bool searchList(const T &, T &) const;
};
这是我目前在 LinkedListADT.h 文件中为搜索功能编写的内容:
template <class T, class S>
bool LinkedList<T, S>::searchList(const S &target, T &dataOut) const
{
bool found = false; // assume target not found
ListNode<T> *pCur;
while (pCur && pCur->getData().getCode() != target){
/*Code to search*/
return found;
}
这是我的 main.cpp 中的搜索功能,它从采用用户输入的大学代码的头文件中调用 searchList。假设使用字符串输入调用 searchList 并尝试在链表中找到与大学代码匹配的项:
void searchManager(const LinkedList<College> &list)
{
string targetCode = "";
College aCollege;
cout << "\n Search\n";
cout << "=======\n";
while(toupper(targetCode[0]) != 'Q')
{
cout << "\nEnter a college code (or Q to stop searching) : \n";
cin >> targetCode;
if(toupper(targetCode[0]) != 'Q')
{
if(list.searchList(targetCode, aCollege))
/*Code to display college*/
else
cout << "Not Found";
}
}
cout << "___________________END SEARCH SECTION _____\n";
}
我确定这不是在头文件中编写模板函数的方法,因为这也会更改其他模板函数(插入、删除等)的模板。我将不胜感激有关正确编写它的方法的任何建议。谢谢大家!
How would I define a template class that could be one or two parameters? (from a comment)
您可以使用 可变参数模板 来完成此操作,但这不是您需要的。相反,您需要 single-argument 模板 class 的模板成员函数,如下所示:
template <class T>
class LinkedList
{
//...
public:
//...
template<class S>
bool searchList(const S& target, T& result) const;
};
将函数定义放在class里面更容易,但是如果你坚持要在外面定义它,语法如下:
template<class T>
template<class S>
bool LinkedList<T>::searchList(const S& target, T& result) const
{
//...
}
一旦你拥有它,你从 main()
调用它的方式应该编译。