当我尝试从 main 调用我的类模板函数时出现错误

Posted

技术标签:

【中文标题】当我尝试从 main 调用我的类模板函数时出现错误【英文标题】:Getting and error when I try to call my class template function from main 【发布时间】:2021-08-29 23:41:48 【问题描述】:

尝试从主函数调用我的函数add() 时出现以下错误。

C:\studies\NMB1231_Question5\main.cpp:25:23: 错误:没有匹配函数调用'Dictionary<:vector>, std::vector<:__cxx11::basic_string char> > >::add(int&, std::__cxx11::string&)'

.h 文件

#include <vector>
#include <string>
#include <iostream>
using namespace std;

template <class A,class B>
class Dictionary

    public:
        Dictionary();
        void add(A key,  const B &value);
        B find (A key) const;
        void display();
    
    private:
        vector<A> keys;
        vector<B> values;
;

.cpp

#include "Dictionary.h"
#include <vector>
#include <iostream>

using namespace std;

template <class A,class B>
Dictionary<A,B>::Dictionary()

    //nothing to do, vector member variables are empty on declaration
;

template <class A,class B>
void Dictionary<A,B>::add(A key,  const B &value)

    keys.push_back(key);
    values.push_back(value);

    
template <class A,class B>
B Dictionary<A,B>::find (A key) const

    B value = " ";
    for (unsigned int i = 0; i < keys.size(); i++)
        if (key == keys[i])
            value = values[i];
    if (value == " ")
        return "no such key can be found";
    else return value;


template <class A,class B>
void Dictionary<A,B>::display()

    for (unsigned int i = 0; i < keys.size(); i++)
        cout << keys[i] << ' ' << values[i] << endl;
    return;

主要

#include <iostream>
#include <cstdlib>
#include "Dictionary.h"
#include <vector>


using namespace std;

int main()

    Dictionary <vector<int>, vector<string > > part1;
    string part;
    int key;
    //add 4 values to the parts dictionary

    for (int i = 0; i <= 3; i++)
    
        cout << "Please enter a part name and a key to add to the parts dictionary." << endl;
        cout << "Part name: ";
        getline(cin, part);
        cout << "Key for part name: ";
        cin >> key;
        part1.add(key,part);
        cin.get();
    

    cout << endl;
    part1.display();
    cout << endl;

    //find the part for a key
    cout << "For which key do you want to find the part? ";
    cin >> key;
    cout << "The part for key " << key << " is ";
    cout << part1.find(key) << endl;
    // cout << parts.find(100002);
    return 0;

【问题讨论】:

@Sneftel 重复的问题与此问题中的错误无关。 你想要 std::map 而不是 std::vector。 【参考方案1】:

在 main 中,您将 part1 变量声明为 Dictionary&lt;vector&lt;int&gt;, vector&lt;string&gt;&gt;。所以它的A模板参数是vector&lt;int&gt;,它的B模板参数是vector&lt;string&gt;

Dictionary::add()AB 的实例作为参数。因此,在这种情况下,add() 在其第一个参数中预期 vector&lt;int&gt; 在其第二个参数中预期 vector&lt;string&gt;。但主要是通过 intstring 代替。这就是您收到错误消息的原因。

您需要将part1 声明为Dictionary&lt;int, string&gt;


话虽如此,您的代码还有其他问题。

Dictionary::add() 在将输入推送到vectors 之前不会查找现有的key。如果key 已经存在,您应该替换 现有条目为新的value,否则推送新的keyvalue。根据定义,字典不应包含重复的键。

B 不是std::stringconst char* 时,Dictionary::find() 不会编译。此外,如果它找不到指定的key,它应该返回一个默认构造的B,或者抛出一个异常。

您确实应该使用std::(unordered_)map 而不是std::vector。让它为您处理key/value 管理。

You can't implement a template class in separate .h/.cpp files(反正不是你想要做的方式)。

【讨论】:

嗨 Remy,感谢您的帮助,这非常有见地。 如果我将 part1 的声明更改为 Dictionary,我现在会遇到更多错误,因为我的函数需要向量而不是 。我还需要继续使用向量,因为这是分配所需的,我不允许更改数据类型。错误 - 对 `Dictionary, std::allocator > >::Dictionary()' 的未定义引用 @Gladmalete part1 必须是 Dictionary&lt;int, string&gt;,这就是您所期望的编码 main() 的方式,无论如何它对于字典来说都是有意义的。至于undefined reference 错误,那是因为you can't implement a template class in separate h/cpp files(反正不是你想要的方式)。 将函数实现移动到头文件似乎可以解决错误。谢谢。

以上是关于当我尝试从 main 调用我的类模板函数时出现错误的主要内容,如果未能解决你的问题,请参考以下文章

从成员函数打印 vector<int> 元素时出现 C++ 段错误

将成员函数传递给模板函数时出现语法错误

从 C 调用汇编函数时出现分段错误错误

当我尝试从 Android Emulator 调用 MFP 适配器时出现以下错误

使用 truffle 在solidity 中调用函数时出现新的 BigNumber() 错误。如何修复错误?

尝试 lint Angular 模板时出现 ESLint 错误