【问题标题】:c++ iterator error "does not refer to a value" [closed]c ++迭代器错误“不引用值”[关闭]
【发布时间】:2017-06-07 16:18:07
【问题描述】:

我只是想为类指针列表创建一个迭代器。我搜索了一段时间,找不到有关此问题的任何信息。在我尝试创建迭代器之前,一切正常。

这是我收到的编译错误消息:

ProcessList.cpp:28:7: error: 'Process' does not refer to a value
            list<Process*>::iterator i;
                 ^
    ./Process.h:3:7: note: declared here
    class Process
          ^
    ProcessList.cpp:28:15: error: expected expression
            list<Process*>::iterator i;
                         ^
    ProcessList.cpp:28:18: error: cannot refer to class template 'iterator' without a template argument list
            list<Process*>::iterator i;
                          ~~^
    /Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/iterator:431:30: note: template is declared here
    struct _LIBCPP_TYPE_VIS_ONLY iterator
                                 ^
    3 errors generated.

这是我的代码。错误来自底部的ProcessList.cpp代码:

//main.cpp
#include <iostream>
#include <list>
#include <random>
#include "ProcessList.h"
#include "Generator.h"
using namespace std;


int main()
{

    ProcessList processList(2);

    processList.getProcess(processList.getProcessList());

    return 0;
}


//Process.h
class Process
{
    public: 
        Process();

        void setPID(int PID);
        int getPID();

        int calculateNumberOfCycles();
        int getNumberOfCycles();

        int calculateMemorySize();
        int getMemorySize();

    private:
        static int number_of_processes;
        int PID;
        int number_of_cycles;
        int memory_size;


};


//Process.cpp
#include <iostream>
#include "Process.h"
using namespace std;

int Process::number_of_processes = 0;//define static variable

//Constructor
Process::Process()
{
    cout << "Process Constructor" << endl;

    PID = number_of_processes;
    number_of_cycles = number_of_processes;
    memory_size = number_of_processes;
    number_of_processes++;

    //number_of_cycles = setNumberOfCycles;
    //memory_size = setMemorySize;

}

//PID Setter
void Process::setPID(int PID)
{

}

//PID Getter
int Process::getPID()
{
    return PID;
}

//Generates a random number of cycles based od the defined variables
int Process::calculateNumberOfCycles()
{
    return 0;
}

//Returns the number of cycles of the process
int Process::getNumberOfCycles()
{
    return number_of_cycles;
}

//Generates a random amount of memory based on the defined variables
int Process::calculateMemorySize()
{
    return 0;
}

//Returns the amount of memory for the process
int Process::getMemorySize()
{
    return memory_size;
}


//ProcessList.h
#include <list>
#include "Process.h"
 using namespace std;

class ProcessList
{
    private:
        list<Process*> processList;

    public:
        ProcessList(int number_of_processes_to_create);
        list<Process*> getProcessList();
        Process* createProcess();
        void getProcess(list<Process*> list);

};


//ProcessList.cpp
 #include <iostream>
 #include "ProcessList.h"
 using namespace std;

ProcessList::ProcessList(int number_of_processes_to_create)
{
    processList.push_back(createProcess());
}

Process* ProcessList::createProcess()
{
    Process *process = new Process();

    return process;
}

list<Process*> ProcessList::getProcessList()
{
    return processList;
}

void ProcessList::getProcess(list<Process*> list)
{

    list<Process*>::iterator i;

}

【问题讨论】:

  • 专业提示:切勿在头文件中使用using namespace std;
  • 您能否提供给我们一个minimal reproducible example 来重现问题。我很确定并非所有代码都需要这样做。循环 #include 语句似乎有问题。
  • 顺便说一句.. 阅读此内容以确保您确实需要使用list 而不是vector softwareengineering.stackexchange.com/questions/185222/… 因为听起来您来自JAVA并且习惯于使用list .在 c++ 中你应该默认使用vector,只有在你需要改进插入和删除时才使用list(基本上来说)
  • @NathanOliver:在这种情况下,我认为它在头文件中并不重要。如果仅在 .cpp 文件中,也会发生同样的事情。

标签: c++ list stl iterator


【解决方案1】:

仔细看这个函数:

void ProcessList::getProcess(list<Process*> list)
{
   list<Process*>::iterator i;
}

list 在函数体内是什么意思?这里不是std::list,因为您已经用参数名称隐藏了它。这对编译器来说毫无意义。

表达你真正意思的简单方法是限定它:

void ProcessList::getProcess(list<Process*> list)
{
    std::list<Process*>::iterator i;
}

但你真的应该在任何地方都这样做,forget you ever heard of using namespace std;。使用list 作为参数名称也不是一个好主意,因为如果不是编译器,它往往会使读者感到困惑。

【讨论】:

  • 这行得通,谢谢!你能知道我是如何在参数名称中隐藏 std::list 的吗?为什么我需要在函数体中重新定义列表?我以前听说使用命名空间 std 是不好的做法,我会阅读该链接,谢谢。*编辑拼写
  • 您已经为该函数定义了一个名为list 的符号,当您在该函数中时,它优先于std:: 命名空间中的list。所以你本地的list隐藏了std::中的那个。
  • 太棒了,再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-01
  • 2017-07-25
  • 2011-07-22
  • 1970-01-01
  • 2019-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多