【问题标题】:unable to resolve identifier push_back无法解析标识符 push_back
【发布时间】:2018-04-23 12:48:50
【问题描述】:

我对 C++ 向量有一个小问题。 在我的 .H 文件中,我有

class MyClass{ 
private:
    std::vector<myObject> test;
public:
    MyClass();
    add(myObject object);
}

在我的 .CPP 文件中

MyClass::MyClass(){
    std::vector<myObject> test;
}
MyClass::add(myObject object){
//here is the problem. Netbeans does even giving me quick cast this method i need to write it myself and it throws an error.
    test.push_back(object);
}

我正在使用 NetBeans 8,它显示“无法解析标识符 push_back,我不知道为什么。我对 C++ 很陌生,并且做了一些研究,但似乎找不到答案。 我的目标是拥有 .H 文件并在 .CPP 中初始化向量,然后我希望有单独的函数,例如 add 将我的对象推送到包含向量的此类。类似于列表的东西,您可以在其中添加对象。

感谢您的帮助。

编辑: 是的,我在顶部包含矢量。

编辑: 就是代码

   #include <vector>

class MyClass{ 
private:
    int a;
    std::vector<int> test;
public:
    MyClass();
    void add(int n);
};

MyClass::MyClass(){
}

void MyClass::add(int m){
//unable to resolve identifier push_back
    test.push_back(m);
}

int main() {

    MyClass a();
//request for member add in a which is of non class type
    a.add(1);


}

【问题讨论】:

  • 不是你问的,但构造函数创建了一个额外的本地向量test 并立即将其丢弃。这和类成员test不一样。
  • 代码有很多问题。发布一个可验证的示例。
  • 请编辑您的问题以包含minimal reproducible example。这是完整的错误信息吗?
  • 提供minimal reproducible example,此代码太不完整,无法诊断。

标签: c++ c++11 netbeans-8


【解决方案1】:

您忘记为 add 方法添加返回类型。 在 H 中试试这个:

void add(myObject object);

这在 CPP 中:

void MyClass::add(myObject object){

【讨论】:

  • 已经试过了,还是没有解决问题。 push_back 仍未解决。
  • 是的,它可以编译,但是将其复制并粘贴到 netbeans 中,您会看到我的错误。就像我不能在向量上调用 push_back。
  • 你也应该在类定义后的H文件末尾添加;
  • 当我想在主文件中使用 .add() 方法时,它不会编译并给出 main.cpp:24:7: error: request for member 'add' in 'a',即非类类型“MyClass()”错误。
【解决方案2】:
int main() {

    MyClass a();
//request for member add in a which is of non class type
    a.add(1);


}

//请求添加非类类型的成员

因为a 不是MyClass 对象。为了使其成为一体,您需要像这样构造它:

MyClass a{};

或者只是这样:

MyClass a;

否则视为函数声明。在这里,编译没有错误https://ideone.com/y7fQXo

【讨论】:

  • 是的,它解决了一个问题,谢谢,但我仍然不能在方法中使用 push_back。它可以编译,但它给了我一个无法解决 push_back 的错误。我在网上看到它可能与一些 netbeans 错误有关,但我不知道这是否是问题。
【解决方案3】:

根据您的“完整”代码(没有显示.h.cpp 之间的分界线,但我相信您的话,代码是完整的),很明显只有一个#include,位于 .h 代码的顶部。我假设.cpp 代码以MyClass::MyClass(){ 行开头,这意味着它没有包含。因此,它没有 任何 来自您的标头的信息,并且通过扩展,没有来自 &lt;vector&gt; 的任何信息。

#include &lt;vector&gt; 需要在您的 .h 中(因为您在类定义中使用了 vector),但您需要 #include "myclass.h"(或任何您命名的头文件)在myclass.cpp(或任何你命名的源文件)中。

没有它,当编译器编译.cpp 文件时,它只是在黑暗中磕磕绊绊。它没有对MyClass 的整体定义,因此不知道testvector&lt;int&gt; 类型的成员。不知道 test 是什么(就此而言,不知道 vector&lt;int&gt; 是什么),它无法解析任何方法。

要完成这项工作,您需要在您的.cpp 中包含您的.h,以便编译器具有解释您的方法定义的声明。如果您的标头名为myclass.h,请添加:

#include "myclass.h"

到您的.cpp 顶部。为了更好地衡量,在源文件中显式地#include &lt;vector&gt; 也可能有意义;是的,它会通过包含标头获得它的副作用,但是双重包含标准库标头(通过包含保护防止双重包含)在很大程度上是无害的,并且它清楚地表明了您所依赖的标准库组件on(对维护者有用)。

【讨论】:

  • 已经完成了。问题可以关闭。我不完全记得解决方案是什么,但我把它整理出来了;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-01
  • 1970-01-01
  • 2016-02-03
  • 1970-01-01
相关资源
最近更新 更多