【问题标题】:How do I fix my program that calls a template function using parameters of different types?如何修复使用不同类型参数调用模板函数的程序?
【发布时间】:2020-10-27 02:19:39
【问题描述】:

我不知道如何调用模板函数,该函数假定将字符串和 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";
}

我确信这不是在头文件中编写模板函数的方法,因为这也会更改其他模板函数(插入、删除等)的模板。我将不胜感激有关正确编写它的方法的任何建议。谢谢大家!

【问题讨论】:

  • 此问题显示的代码不符合 stackoverflow.com 对 minimal reproducible example 的要求。这意味着这里的任何人都不太可能最终回答这个问题。但最多只能猜测。你应该edit你的问题来展示一个最小的例子,不超过一两页代码(“最小”部分),其他人都可以剪切/粘贴、编译、运行和重现所描述的问题(“ reproducible”部分)完全如图所示(这包括任何辅助信息,例如程序的输入)。请参阅How to Ask 了解更多信息。
  • @SamVarshavchik 抱歉,我刚刚编辑了帖子。现在它应该包含需要回答的最少信息。
  • 你的函数有什么问题?
  • 你的头部定义了一个模板类,它只有一个参数,而不是两个。
  • @Eugene 我不能通过传递 (string, college) 在我的 main 中调用模板 searchList 函数,因为它说两个参数都需要是 College 对象。我不确定我的模板是否需要更改,或者我对 main 中的 searchList 函数的调用是否需要更改。我只是想知道如何在我的主文件中调用 searchList。

标签: c++ templates types function-call function-templates


【解决方案1】:

我将如何定义一个可能是一两个的模板类 参数? (来自评论)

您可以通过使用可变参数模板来做到这一点,但这不是您需要的。相反,您需要一个单参数模板类的模板成员函数,如下所示:

template <class T>
class LinkedList
{
    //...
public:
    //...

    template<class S>
    bool searchList(const S& target, T& result) const;
};

把函数定义放在类里面比较容易,但是如果你坚持要在外面定义,语法如下:

template<class T>
template<class S>
bool LinkedList<T>::searchList(const S& target, T& result) const
{
    //...
}

一旦你拥有它,你从main() 调用它的方式应该可以编译。

【讨论】:

  • 这回答了我的问题。非常感谢!
  • (您的个人资料显示您没有接受任何答案。接受答案是本网站的礼仪)。
  • @drewster 请阅读What should I do when someone answers my question?。如果它可以帮助您解决问题,您应该接受答案,正如 Eugene 所说,您已经留下了所有问题而没有接受任何答案。
  • @Eugene 和 TedLyngmo,对不起,我试图找到一种方法将这个问题标记为已回答,但我找不到。谢谢你告诉我!
猜你喜欢
  • 1970-01-01
  • 2021-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-25
  • 2020-03-26
  • 2021-10-01
相关资源
最近更新 更多