Having a problem with 2 classes: a class that is used to go through file directories and collect the file names in a vector, the other just creates an instance of this class. This code is from an older version of the program so I know it works. However, trying to break it down into smaller chucks (with classes etc) i'm getting an error when I try to assign:
vector<string> test = fileNames.processFilesNames();

error C2228: left of '.processFilesNames' must have class/struct/union

I'm not sure if C++ doesn't like this assignment or whether I've done something wrong.

Here's the code, any feedback would be most appreciated. Thanks!


#include "stdafx.h"
#include <FileNames.h>
using namespace std;

int main(){

	FileNames fileNames();
	vector<string> test = fileNames.processFilesNames();
	return 0;


#pragma warning(disable: 4786)
#include <io.h>
#include <iostream>
#include <string>
#include <vector>
#include <list>
using namespace std;

class FileNames{

	vector<string> processFileNames(){
		vector<string> filePaths;
		collectFileNames(filePaths);				// Method call to collect file names in directories
		return filePaths;


		/*Structure to hold a directory and all its filenames.*/
		struct FILELIST{
			string filePath;
			vector<string> fileNameList;

	 * Calls the transverseDirectory() method to gather file names. Stores them in a list of strings
	 * @param &filePaths	- Reference to the string vector that is storing the file names
	void collectFileNames(vector<string> &filePaths){
		list<FILELIST> MyList;
		string path;
		cout << "Enter starting path ... ";
		list<FILELIST>::iterator it;

		for(it = MyList.begin(); it != MyList.end(); it++){
			vector<string>::iterator its;
			for(its = (*it).fileNameList.begin(); its != (*it).fileNameList.end(); its++){
				string fileName =  *its;
				int index_gts = fileName.find(".gts");
				if(index_gts == string::npos){
					filePaths.push_back((*it).filePath + "\\" + (*its));

	/**##########transverseDirectory(string, list<FILELIST>)##########
	 * Recursively goes through files and sub-directories
	void transverseDirectory(string path, list<FILELIST> &theList){
		struct _finddatai64_t data;
		string fname = path + "\\*.*";
		long h = _findfirsti64(fname.c_str(),&data);
		if(h >= 0){
			FILELIST thisList;
			// add empty FILELIST structure to the linked list argument
			// get pointer to the FILELIST just added to the linked list above.
			list<FILELIST>::iterator it = theList.end();
			// set current path
			(*it).filePath = path;
				if( (data.attrib & _A_SUBDIR)){
					// make sure we skip "." and "..".  Have to use strcmp here because
					// some file names can start with a dot, so just testing for the 
					// first dot is not suffient.
					if( strcmp(data.name,".") != 0 &&strcmp(data.name,"..") != 0){
						// We found a sub-directory, so get the files in it too
						fname = path + "\\" + data.name;
						// recursion here!
					// this is just a normal filename.  So just add it to our vector
			}while( _findnexti64(h,&data) == 0);
			// close the find handle.  

Just realised I missed out #include <string> and <vector>. Doesn't make any difference

Have you tried changing #include <FileNames.h> to something more like #include "FileNames.h" ? The behavior of #include <> is different from the behavior of #include "".

Just found my error. It was just the parentheses at the end of

FileNames fileNames();

Surely any other IDE would have but a red squiggley line under it?

Wow, I can't believe I missed that... I'm not so sure another IDE would have flagged it. Technically, that is a valid function declaration/signature/prototype and is valid syntax.

The issue is that it's inside main(), which isn't allowed. You can't declare a function inside of another function.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of 1.18 million developers, IT pros, digital marketers, and technology enthusiasts learning and sharing knowledge.