当我尝试从 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<vector<int>, vector<string>>
。所以它的A
模板参数是vector<int>
,它的B
模板参数是vector<string>
。
Dictionary::add()
将 A
和 B
的实例作为参数。因此,在这种情况下,add()
在其第一个参数中预期 vector<int>
在其第二个参数中预期 vector<string>
。但主要是通过 int
和 string
代替。这就是您收到错误消息的原因。
您需要将part1
声明为Dictionary<int, string>
。
话虽如此,您的代码还有其他问题。
Dictionary::add()
在将输入推送到vector
s 之前不会查找现有的key
。如果key
已经存在,您应该替换 现有条目为新的value
,否则推送新的key
和value
。根据定义,字典不应包含重复的键。
当B
不是std::string
或const 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 的声明更改为 Dictionarypart1
必须是 Dictionary<int, string>
,这就是您所期望的编码 main()
的方式,无论如何它对于字典来说都是有意义的。至于undefined reference
错误,那是因为you can't implement a template class in separate h
/cpp
files(反正不是你想要的方式)。
将函数实现移动到头文件似乎可以解决错误。谢谢。以上是关于当我尝试从 main 调用我的类模板函数时出现错误的主要内容,如果未能解决你的问题,请参考以下文章
从成员函数打印 vector<int> 元素时出现 C++ 段错误
当我尝试从 Android Emulator 调用 MFP 适配器时出现以下错误