如何修复使用不同类型参数调用模板函数的程序?

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() 调用它的方式应该编译。