error: expected primary-expression before...

Pages: 12
I can't figure out these errors. Every function call I make in the cpp file gives me these errors:

movie.cpp: In member function ‘void movie::menu(int, movie*)’:
movie.cpp:57: error: expected primary-expression before ‘*’ token
movie.cpp: In member function ‘void movie::enter_movie(movie*)’:
movie.cpp:68: error: expected primary-expression before ‘name’
movie.cpp:69: error: expected primary-expression before ‘int’
movie.cpp:70: error: expected primary-expression before ‘int’
movie.cpp:71: error: expected primary-expression before ‘*’ token
movie.cpp:72: error: expected primary-expression before ‘rating’
movie.cpp:73: error: expected primary-expression before ‘int’
main.cpp: In function ‘int main()’:
main.cpp:29: error: expected primary-expression before ‘int’
main.cpp:29: error: expected primary-expression before ‘*’ token
main.cpp:29: error: expected primary-expression before ‘)’ token

Lines 68-73 correspond to the enter_movie() function. line 29 is for main's call to the menu function.

class
1
2
3
4
5
6
7
8
9
class movie
{
	private:
                // There's several private members here
	public:
		void menu( int, movie * );
		void enter_movie( movie * );
                // there's several other functions here, their calls can be seen below
};

cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
void movie::menu( int choose, movie *m )
{
	do
	{	
		cout << "Would you like to enter or rent a movie?" << endl;
		cout << "( 1 - enter, 2 - rent, 0 - exit ): ";
		cin >> choose;
		cout << endl;
	}
	while ( choose >= 0 && choose <= 2 );

	if ( choose == 1 )
		m->enter_movie( movie *m ); //supposed to call enter movie function.
	if ( choose == 2 )
		// Enter search mode
	if ( choose == 0 )
		exit(1);
}

void movie::enter_movie( movie *m )
{
	m->set_name( string name );
	m->set_stars( int stars );
	m->set_num_cast( int num_cast );
	m->set_cast( string *cast );
	m->set_rating( string rating );
	m->set_copies( int copies );
        //these functions are the other public member functions, their parameters are the 
        //private member variables.
}

main
1
2
3
4
5
6
7
8
int main()
{
	netflix Netflix;
	movie Movie;
	Movie.menu( int, movie * );

	return 0;
}


I just want to get past these errors at the moment. Also movie * is from the movie class being a private member of another class. I'm guessing I shouldn't be using it like this although I was told today that I should. I don't know, I barely know what I'm doing. But if I could get some assistance with these errors I'll be eternally grateful. :)
Could you indicate what lines on the errors correspond to what lines in your posted code?
oops must have forgotten:
movie.cpp line 57 = cpp line 13
movie.cpp lines 68-73 = lines 22-27
main.cpp line 29 = main line 5

thanks for checking it out :)
Do you know how to call a function? It sounds simple, but it seems the errors are all from the same kind of mistake when calling the function. You might want to read this tutorial, paying close attention to how functions are called in the examples:
http://www.cplusplus.com/doc/tutorial/functions/
Sadly I've been reading about functions all day trying to figure out what it is that I'm doing wrong. I read through the tutorial page to just to look for any thing I may have missed. Still I'm finding very little info on properly calling member functions of classes with private variables. That wasn't covered in the tutorial, or hardly any where that I can find. I tried using the dot (.) instead of the arrow (->) but that made my errors worse.
The way I have them set up now was suggested by a TA. So I don't really know what else to do, every one I've talked to so far has lead me to the code I have but no one's been able to get past these errors. I've been assuming that there's something horribly wrong with the function call but I just can't find it.
Your use of . and -> are fine; it is the parameter list that is the issue. Compare that to the tutorial's example of calling a function and see if you can spot the difference.
So all the examples have parameters that are empty, with variables, with types, or with types and variables. Some use the &. I swear I've tried all possible combinations. Unless there's somehow one Ive missed I honestly don't see anything different. Also all the examples have quite different parameter set-ups, could you please point out one of the examples that has the difference in it and maybe I could better pinpoint what difference I'm looking for. Thank you. :)
movie.h
lines 6-7: You don't need to pass a pointer to movie as an argument. A function that is a member of a class implicity has access to the member variables of the class.

movie.cpp
Line 1,20: Ditto.

Line 13: Simply call enter_movie(). You don't need to pass any arguments.

Lines 22-27: 1) You don't need the m-> to call member functions of your class. 2) You don't specify types in a function call. Types are only specified in a functin prototype. 3) Since you haven't shown these functions, it's not clear if these functions are prompting for input. If they are, you don't need arguments at all.

main.cpp
line 5: 1) You have to pass an integer value, not a type. Again, you don't specify types in a function call. 2) movie * is a type. You don't need this argument since the instance of movie is specified by the Movie variable.





You are confusing two concepts:

1. Declaring and defining functions and members of classes.

2. Calling functions and members of classes ( whether you call a class member on an object or a static member on a class)

When you define a function, you have to add the type of the parameter:

1
2
3
int sum( int number1, int number2) {
    return number1 + number2;
}


Now I want to use the function I wrote:

1
2
3
4
5

int main(void) {
    std::cout << sum( 1, 2) << std::endl;
}



What you do wrong in the main function:

1
2
3
4
5
6
7
8
int main()
{
	netflix Netflix;
	movie Movie;
	Movie.menu( int, movie * );

	return 0;
}


Is calling the member function with types, instead of values or variables. Try this:

1
2
3
4
5
6
7
8
9
int main()
{
	netflix Netflix;
	movie Movie;
        movie *pointerToMovieObject = new movie();
	Movie.menu( 3, pointerToMovieObject );

	return 0;
}


Post the entire code when you're done.
I will help you out with your code
Alrighty, it took a mix of both you guys advice but I'm down to just one error:

movie.cpp:42: error: variable or field ‘menu’ declared void

42 in my code is line 1 above.

I took out the pointers and the m->. I took out the parameters of all the function calls with two exceptions. Main line 5 and movie.cpp line 1 have a 0 in them and that's it. Also in movie.cpp line 20 it's now just void movie::enter_movie( movie ). It wouldn't let me take it out or it got mad at me. I don't really know why I need the number in the two function calls to get rid of so many errors. I tried just declaring the function in the class without any parameters at all since I was asking for the number inside the function but it got mad at me for that too. Feels like c++ is just out to get me. I do things that seem logical to me but the compiler blows up overtime I try something. Anyways, any clues on that last error? :)
Last edited on
@mt106250
Hi didn't see your post there till just now, I'll post it here in a bit. I'll warn you it's long, but thank you for helping:)
@andres81

There are a few problems with the code you posted:
main.cpp
Line 5: There is no reason to dynamically allocate an instance of movie.
Line 6: As I pointed out before, there is no reason to pass a pointer to a movie instance assuming all the OP wants to do is update a single instance (Movie).
Line 7: You have a memory leak. The instance of movie that was dynamically allocated was never released.

@OP
It wouldn't let me take it out or it got mad at me. I don't really know why I need the number in the two function calls to get rid of so many errors.

In movie.cpp line 1, you're passing choose as an argument. There is really no need for choose to be an argument since you prompt for it at line 7. However, if you remove choose as an argument, you must declare it locally within menu().

Last edited on
Ok here's the whole thing, maybe that will clear any confusion of what I've attempted to do. Also there's several blank functions that I just haven't even gotten to yet because I either don't know what I'm supposed to use it for or I'm waiting to get past these errors before I get into them. Figured I'd get past the current errors before I start making more. :)

net header
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#ifndef NETFLIX_H
#define NETFLIX_H
#include <iostream>
#include <string>
#include <fstream>
#include <cstdlib>
#include "./movie.h"


class netflix
{

	private:
		movie *m;
		int num_movies;

	public:
		netflix();
		netflix( const netflix & );
		~netflix();
		void set_movie( movie * );
		void set_num_movies( int );
		movie get_movie();
		int get_num_movies();

};

#endif 


net.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
#include "./netflix.h"

using std::cout;
using std::cin;
using std::endl;
using std::string;

netflix::netflix()
{

	m = NULL;
	num_movies = 0;

}

netflix::~netflix()
{

	delete [] m;
	m = NULL;

}

netflix::netflix( const netflix & ){}

void netflix::set_num_movies( int ){}

movie netflix::get_movie() { return *m; }
int netflix::get_num_movies() { return num_movies; }


movie header
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#ifndef MOVIE_H
#define MOVIE_H
#include <iostream>
#include <cstdlib>
#include <string>
#include <fstream>

using std::string;

class movie
{

	private:
		string name;
		int stars;
		int num_cast;
		string *cast;
		string rating;
		int copies;

	public:
		movie();
		~movie();
		movie( const movie & );
		void menu( int );
		void enter_movie( movie );
		void set_name( string );
		void set_stars( int );
		void set_num_cast( int );
		void set_cast( string * );
		void set_rating( string );
		void set_copies( int );
		string get_name();
		int get_stars();
		int get_num_cast();
		string get_cast();
		string get_rating();
		int get_copies();

};

#endif 


movie.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
#include "./movie.h"

using std::cout;
using std::cin;
using std::endl;
using std::string;

movie::movie()
{

	stars = 0;
	num_cast = 0;
	cast = NULL;
	copies = 0;

}

movie::~movie()
{

	delete [] cast;
	cast = NULL;

}

movie::movie( const movie & ){}

void movie::menu( 0 )
{

	int choose;

	do
	{
	
		cout << "Would you like to enter or rent a movie?" << endl;
		cout << "( 1 - enter, 2 - rent, 3 - exit ): ";
		cin >> choose;
		cout << endl;
	
	}
	while ( choose >= 1 && choose <= 3 );

	if ( choose == 1 )
		enter_movie();
	if ( choose == 2 )
		// Enter search mode
	if ( choose == 3 )
		exit(1);

}

void movie::enter_movie( movie )
{

	set_name();
	set_stars();
	set_num_cast();
	set_cast();
	set_rating();
	set_copies();

}

void movie::set_name( string )
{

	cout << "Movie title: ";
	getline( cin, name );

}

void movie::set_stars( int )
{

	cout << "Number of stars: ";
	cin >> stars;

}

void movie::set_num_cast( int )
{

	cout << "Number of cast members: ";
	cin >> num_cast;

}

void movie::set_cast( string * )
{

	for ( int i = 0; i < num_cast; ++i )
	{
	
		cout << "Cast member #" << i << ": ";
		getline( cin, *cast );
	
	}

}

void movie::set_rating( string )
{

	cout << "Rating: ";
	getline( cin, rating );

}

void movie::set_copies( int )
{

	cout << "Number of copies: ";
	cin >> copies;

}

string movie::get_name() { return name; }
int movie::get_stars() { return stars; }
int movie::get_num_cast() { return num_cast; }
string movie::get_cast() { return *cast; }
string movie::get_rating() { return rating; }
int movie::get_copies() { return copies; }


main
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <string>
#include <cstdlib>
#include <fstream>
#include "./netflix.h"
#include "./movie.h"

using namespace std;

//void menu();

int main()
{

//	menu( int );

	netflix Netflix;
	movie Movie;
	movie *m = new movie();
	Movie.menu( 0 );

	return 0;

}


output: refers to line 32 in this post.

movie.cpp:42: error: variable or field ‘menu’ declared void


I'm sorry if the things I've done in this code are just ridiculous. I'm amazingly terrible at coding despite spending all of my free time reading the 2 books I have and going to TA office hours. I took me a week just to figure out how to begin designing the thing and it's been a week of me being stuck at this point. Seems like every thing I do make it worse. I am dying to understand this stuff so any thing you can say to help will be greatly appreciated. Thank you much. :)
movie.cpp line 32: get rid of the 0. This function should not have any arguments. 0 is not valid in an argument list.

main.cpp line 19: get rid of this line. There is no reason to dynamically allocate a move instance. It's also causing a memory leak since you never delete it.

main.cpp line 20: get rid of the 0. You can't pass a 0 to a function that doesn't take any arguments.

movie.cpp line 30: If you're going to pass an argument here, you need to name the argument.

Line 57, 69, 77, 85, 93, 106, 114: Again, if you're going to pass and argument to these functions, you need to specify a name, not just a type. You can get away with not specifying a name in the declaration, but a name is required in the definition. However, I don't see that you need any of these arguments.

movie.h line 17: Why is cast a pointer? In movie.cpp line 100, you're trying to do a getline to a null pointer. That's going to cause a trap or an exception.

I'm assuming your intention here is to allow multiple cast members. If that's what you're trying to do, you should use a vector:
1
2
3
4
5
6
    vector<string>  cast;
...
// In movie::set_cast
   string cast_member;
   getline (cin, cast_member);
   cast.push_back (cast_member);


Likewise in netflix.h, I assume your intent with the movie pointer is to allow multiple movies. Again you should use a vector.
1
2
3
4
  vector<movie>  movies;
...
  // In netflix::set_movie you should be passing movie by reference
  movies.push_back (movie);


Last edited on
hmm, I made all the recommended changes. These are my new errors:

In file included from ./netflix.h:18,
                 from netflix.cpp:15:
././movie.h:28: error: ISO C++ forbids declaration of ‘vector’ with no type
././movie.h:28: error: expected ‘;’ before ‘<’ token
In file included from netflix.cpp:15:
./netflix.h:25: error: ISO C++ forbids declaration of ‘vector’ with no type
./netflix.h:25: error: expected ‘;’ before ‘<’ token
netflix.cpp: In constructor ‘netflix::netflix()’:
netflix.cpp:25: error: ‘m’ was not declared in this scope
netflix.cpp: In destructor ‘netflix::~netflix()’:
netflix.cpp:33: error: ‘m’ was not declared in this scope
netflix.cpp: At global scope:
netflix.cpp:40: error: prototype for ‘void netflix::set_movie()’ does not match any in class ‘netflix’
./netflix.h:33: error: candidate is: void netflix::set_movie(movie*)
netflix.cpp: In member function ‘movie netflix::get_movie()’:
netflix.cpp:44: error: ‘m’ was not declared in this scope
In file included from movie.cpp:15:
./movie.h:28: error: ISO C++ forbids declaration of ‘vector’ with no type
./movie.h:28: error: expected ‘;’ before ‘<’ token
movie.cpp: In constructor ‘movie::movie()’:
movie.cpp:27: error: ‘cast’ was not declared in this scope
movie.cpp: In destructor ‘movie::~movie()’:
movie.cpp:35: error: ‘cast’ was not declared in this scope
movie.cpp: At global scope:
movie.cpp:42: error: prototype for ‘void movie::menu()’ does not match any in class ‘movie’
./movie.h:37: error: candidate is: void movie::menu(int)
movie.cpp:67: error: prototype for ‘void movie::enter_movie()’ does not match any in class ‘movie’
./movie.h:38: error: candidate is: void movie::enter_movie(movie)
movie.cpp:79: error: prototype for ‘void movie::set_name()’ does not match any in class ‘movie’
./movie.h:39: error: candidate is: void movie::set_name(std::string)
movie.cpp:87: error: prototype for ‘void movie::set_stars()’ does not match any in class ‘movie’
./movie.h:40: error: candidate is: void movie::set_stars(int)
movie.cpp:95: error: prototype for ‘void movie::set_num_cast()’ does not match any in class ‘movie’
./movie.h:41: error: candidate is: void movie::set_num_cast(int)
movie.cpp:103: error: prototype for ‘void movie::set_cast()’ does not match any in class ‘movie’
./movie.h:42: error: candidate is: void movie::set_cast(std::string*)
movie.cpp:119: error: prototype for ‘void movie::set_rating()’ does not match any in class ‘movie’
./movie.h:43: error: candidate is: void movie::set_rating(std::string)
movie.cpp:127: error: prototype for ‘void movie::set_copies()’ does not match any in class ‘movie’
./movie.h:44: error: candidate is: void movie::set_copies(int)
movie.cpp: In member function ‘std::string movie::get_cast()’:
movie.cpp:138: error: ‘cast’ was not declared in this scope
In file included from ./netflix.h:18,
                 from main.cpp:15:
././movie.h:28: error: ISO C++ forbids declaration of ‘vector’ with no type
././movie.h:28: error: expected ‘;’ before ‘<’ token
In file included from main.cpp:15:
./netflix.h:25: error: ISO C++ forbids declaration of ‘vector’ with no type
./netflix.h:25: error: expected ‘;’ before ‘<’ token
main.cpp: In function ‘int main()’:
main.cpp:29: error: no matching function for call to ‘movie::menu()’
././movie.h:37: note: candidates are: void movie::menu(int)

There's a lot of errors in here that I previously had, but now theres even more. :(
I was sure to add the #include <vector> . Other than that, not sure.
Why dont you place your netflix header and movie header together?
Along with netflix.cpp and movie.cpp
That's actually how I had it originally, but it's required that everything be separate. It's dumb, I hate it, don't understand why it has to be this way. I would totally prefer to just have everything in one file. As it is I have to have 5 terminal windows open at once so I can see everything. It really bums me out. :)
That's understandable.

I think what you should do is work on your other functions, that way you can fix all your errors
If your entire program compiles, post your program so we adjust things more!
Pages: 12