如何修复"没有重载功能的实例"在vector push_back中?

时间:2017-02-22 20:42:00

标签: c++ c++11 visual-c++

我想编写一个函数,它将一个指向一个字符串(Dictionary)的向量指针和一个指向char(p)的指针作为输入。该函数将检查字符是否在字典中,如果它不在那里,它会在向量字典中添加p。

我的代码:

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

std::vector<string *> dictionary;

void manageDictionary(vector<string *> * dictionary, char *p) {
    for (unsigned int i = 0; i < (*dictionary).size(); i++) {
        string * pstring = (*dictionary).at(i);
        if ((*pstring).compare(p)) {
            (*dictionary).push_back(p);
        }
    }
}

然而,visual studio编译器显示我在push_back方法(.)之前的if语句中有错误。当我将鼠标悬停在错误上时,它会显示&#34;没有重载功能的实例&#34;。

我在开头添加了std::vector<string *> dictionary;,仍然无法找出问题所在。

1 个答案:

答案 0 :(得分:1)

dictionnarystd::string*的向量。 std::string*char*完全不相关。要从char*转换为std::string*,您需要为自己的词典创建一个包含string值的新p,而不是直接传递char* 。此更改将允许您的示例进行编译,但生成的函数容易出错。

#include <string>
#include <vector>
using std::string;
using std::vector;

void manageDictionnary(vector<string *> * dictionnary, char *p) {
    for (unsigned int i = 0; i < (*dictionnary).size(); i++) {
        string * pstring = (*dictionnary).at(i);
        if ((*pstring).compare(p)) {
            (*dictionnary).push_back(new string(p));
            // Make a new string     ^^^^^^^^^^
        }
    }
}

此解决方案将要求您手动删除字符串,这与c ++中的操作方式不同。从std::vector<std::string*>更改为简单std::vector<std::string>将解决此问题,并避免将来出现问题。还有其他不必要的指针可以删除。由于at(i)会返回string&,因此我们应将pstring更改为string&。由于dictionnary不是可选的(不能nullptr)且始终指向相同的vector,我们也可以将其更改为vector<string>&

void manageDictionnary(vector<string> & dictionnary, char *p) {
    for (unsigned int i = 0; i < dictionnary.size(); i++) {
        string & pstring = dictionnary.at(i);
        if (pstring.compare(p)) {
            dictionnary.push_back(p);
        }
    }
}

这个最新版本将运行良好,更符合c ++的资源管理理念。我建议您阅读以下几个主题:

此外,请考虑使用std::set<string>std::unordered_set<string>来更方便地表示字典。

将来请注意,访问指针方法的首选方法是ptr->foo(),而不是(*ptr).foo()