【问题标题】:why is there a "no instance of overloaded function matches the argument list" error when attempting vector push_back?为什么在尝试向量 push_back 时出现“没有重载函数的实例与参数列表匹配”错误?
【发布时间】:2021-12-12 05:10:57
【问题描述】:

我正在为 C++ 类做作业,但在使用带有向量的推回时出现错误。老实说,我找不到任何关于为什么这不起作用并给我“没有重载函数实例”错误的信息

 class StudentData {

    class StudyModule {
    private:
        const int studyModuleCode;
        const std::string studyModuleName;
    public:
        StudyModule();
        StudyModule(const StudyModule& copy);
        ~StudyModule();
    };

    private:
        const int studentNumber;
        std::string studentName;
        std::vector<StudyModule*> modules;
    public:
        StudentData();
        StudentData(const StudentData& copy);
        ~StudentData();
        void addModules(const StudyModule& module);
        int howManyModules();
};



void StudentData::addModules(const StudyModule& module)
{
    this->modules.push_back(&module);
}

【问题讨论】:

  • 小测验:向量中的那些指针——它们是指向常量还是非常量对象的指针,你是否将一个常量或非常量对象的引用传递给了这个函数?跨度>
  • 小问题:您的函数名为 addModules()(强调多个),但您一次只能添加一个模块。
  • StudyModule 中 0/3/5 的错误规则。它应该是 0 规则,但声明了 2 个(非)必需函数。 const私人成员毫无意义。

标签: c++ vector constants overloading push-back


【解决方案1】:

函数addModules() 声明如下:

void addModules(const StudyModule& module);

也就是说,它的参数是对const对象的引用。

但是向量有一个指向非常量对象的指针作为它的模板参数:

std::vector<StudyModule*> modules;

因此,编译器为此语句发出一条消息:

this->modules.push_back(&module);

因为表达式&amp;module 的类型为const StudyModule *,即一个指向常量对象的指针。

即使您会像这样更改向量的模板参数:

std::vector<const StudyModule *> modules;

您的方法将是不安全的,因为用户可以将StudyModule 类型的临时对象传递给函数。在这种情况下,将指向该对象的指针存储在向量中,当临时对象随后被销毁时,将变得无效。

【讨论】:

  • 是的,谢谢,这一切都解决了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-27
  • 2013-10-19
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 2019-07-16
相关资源
最近更新 更多