错误:变量或字段声明为void

时间:2011-10-14 03:50:01

标签: c++ unix traversal

这实际上是我的导师提供给我们使用的程序,到目前为止我必须进行一些更改才能使其至少编译:

 #include <dirent.h>
#include <errno.h>
#include <stdio.h>
#include <cstdlib>
#include <iostream>
#include <cctype>
#include <cstdio>
#include <string>
#include <list>

using namespace std;
std::string makeString();
std::string path= "/";
DIR*dirp;
struct dirent*direntp;
std::list<string> child_directories;



void dir_traverse(&path, ios::out){
    list<string> child_directories;
    DIR*dirp = opendir(path.data());
    struct dirent*dir_entry = readdir(dirp);
        while(dir_entry !=null){ 
             unsigned char d_type = dir_entry->d_type==DT_OIR?'D' : 'R';
             if(d_type == 'D'){ 
                if(dir_entry->d_name[0]!= '.')
                    {
                    child_directories push_back(dir_entry_d_name);
                }

             }
            out<<'\t'<<d_type<<":"<<dir_entry->d_name<<endl;
            dir_entry= readdir(dirp);
        }
        list<string>::iterator it = child_directories.begin();
        while(it! = child_directories.end())
            {
                dir_traverse(&path + "/" + *it, out);
                it++;
            }
        closedir(dirp);
}

我在参考dir_traverse函数时得到了错误。我非常有兴趣弄清楚导致问题的原因和原因。函数中有一半是我目前没有得到的,这可能就是我编译问题的原因。只是还没有达到c / c ++的速度:)

感谢

编辑:

void dir_traverse(string& path, ostream& out){
    list<string> child_directories;
    DIR*dirp = opendir(path.data());
    struct dirent*dir_entry = readdir(dirp);
        while(dir_entry !=NULL){ 
             unsigned char d_type = dir_entry->d_type==DT_DIR?'D' : 'R';
             if(d_type == 'D'){ 
                if(dir_entry->d_name[0]!= '.')
                    {
                    child_directories.push_back(dir_entry_d_name);
                }

             }
            out<<'\t'<<d_type<<":"<<dir_entry->d_name<<endl;
            dir_entry= readdir(dirp);
        }
        list<string>::iterator it = child_directories.begin();
        while(it != child_directories.end())
            {
                dir_traverse(&path + "/" + *it, out);
                it++;
            }
        closedir(dirp);
}

2 个答案:

答案 0 :(得分:2)

void dir_traverse(&path, ios::out)

这看起来像一个函数定义,除了参数是错误的。函数声明如下:

return_type function_name( arg0_type arg0, ..., argN_type argN )

答案 1 :(得分:2)

好的,所以你需要对教师的样本做一些修改才能让它编译。<​​/ p>

我假设你已经包含了编译所需的四个头文件。我建议您从std namespace中提取以下四个符号,而不是全部。我个人更喜欢在我的代码中引用std::string

using std::string;
using std::ostream;
using std::list;
using std::endl;

无论如何,只需要修改以下三行:

void dir_traverse(string& path, ostream& out) 

应该......

void dir_traverse(const string& path, ostream& out)

因为你后来在递归调用函数时传入一个临时函数。

            child_directories.push_back(dir_entry_d_name); 

应该......

            child_directories.push_back(dir_entry->d_name);

这看起来像一个错字!

    dir_traverse(&path + "/" + *it, out);

应该......

    dir_traverse(path + "/" + *it, out);

这看起来也像一个错字。这是您创建我之前提到的临时path string的地方。这必须作为const引用传递(因为它不通过值传递)。

当您练习更多时,您将更加适应编译器的错误消息!

祝你好运!