2012-06-03 57 views
0

我正在製作一個函數,用於引用文件系統上的路徑並遞歸地將文件名添加到矢量。但首先,我必須能夠向矢量添加路徑。C++將解除引用的對象推向向量

這種方法有什麼問題?

namespace filesys = boost::filesystem; 

方法:

void recursive_file_list(filesys::path & root_path, vector<filesys::path> & paths) { 
    paths->push_back(*root_path); // line 14 

    // TODO: add more logic to actually recurse through file system 
    // for now just add root_path (even though root_path is path of directory, not file) 
} 

我叫它像這樣:

int main(int argc, char* argv[]) { 

     // Use the command line arguments 
     filesys::path abs_path; // line 23 
     if (argc > 1) 
      // Make the system complete this path to absolute path 
      abs_path = filesys::system_complete(filesys::path(argv[1])); 
     else { 
      // If no arguments given 
      cout << "usage: list_files [path]" << endl; 
      exit(1); 
     } 

     // Is this a valid path? 
     if (!filesys::exists(abs_path)) { 
      cout << "The path you have specified does not exist." << endl; 
      exit(2); 
     } 

     // If this is a directory 
     vector<filesys::path> filepaths(); 
     if (filesys::is_directory(abs_path)) { 
      cout << "You have specified a directory." << endl; 
      recursive_file_list(&abs_path, &filepaths); 
     } 

     else { 
      cout << "You have specified a file." << endl; 
     } 
    } 

錯誤:

list_files.cpp: In function 'void recursive_file_list(boost::filesystem3::path&, std::vector<boost::filesystem3::path, std::allocator<boost::filesystem3::path> >&)': 
list_files.cpp:14: error: base operand of '->' has non-pointer type 'std::vector<boost::filesystem3::path, std::allocator<boost::filesystem3::path> >' 
list_files.cpp:14: error: no match for 'operator*' in '*root_path' 
list_files.cpp: In function 'int main(int, char**)': 
list_files.cpp:43: error: invalid initialization of non-const reference of type 'boost::filesystem3::path&' from a temporary of type 'boost::filesystem3::path*' 
list_files.cpp:13: error: in passing argument 1 of 'void recursive_file_list(boost::filesystem3::path&, std::vector<boost::filesystem3::path, std::allocator<boost::filesystem3::path> >&)' 

我不明白 - 我傳遞通過引用,然後解引用它來添加它......不確定wh在我做錯了。

+3

爲什麼-1?我用C++並不是很好,但我不認爲這意味着我不應該問這個問題。 – lollercoaster

回答

4

您無法取消引用! *->運營商不適用於引用;你將自己推pathvector本身:

paths.push_back(root_path); // line 14 

,此外,你不通過地址引用參數,只是參數本身,所以你會這樣調用該函數:

recursive_file_list(abs_path, filepaths); 

引用本身都有類似指針的非複製語義;你不需要通過接收地址或嘗試解除引用來幫助他們。

+0

但是我想將'path'的值添加到矢量中.. – lollercoaster

+1

事實上,這就是會發生的事情。因爲'recursive_file_list()'的參數是引用參數,'recursive_file_list()'中的'push_back'影響'main()'中聲明的'vector'。這就是參考參數的全部要點! –

+0

我的想法是,因爲我傳入的'path'是一個引用,那麼向該變量添加該向量就會添加一個引用。 C++在添加之前是否自動解引用它? – lollercoaster