-
April 3rd, 2013, 03:13 AM
#1
error C2061: syntax error : identifier 'string'
Hi,
I've just recently started to learn C++, and I'm encountering some errors I can't seem to figure out.
InventoryItem.h:
Code:
#pragma once
class InventoryItem
{
public:
InventoryItem(string name, int amount);
~InventoryItem(void);
string getName(void);
int getAmount(void);
private:
string name;
int amount;
};
InventoryItem.cpp:
Code:
#include "stdafx.h"
#include "InventoryItem.h"
InventoryItem::InventoryItem(string name, int amount) : name(name), amount(amount) {}
InventoryItem::~InventoryItem(void) {}
stdafx.h:
Code:
#pragma once
#include "targetver.h"
#include "InventoryItem.h"
#include <stdio.h>
#include <tchar.h>
#include <iostream>
#include <string>
using namespace std;
Errors:
Code:
1>d:\c++\consoleapplication\consoleapplication\inventoryitem.h(6): error C2061: syntax error : identifier 'string'
1>d:\c++\consoleapplication\consoleapplication\inventoryitem.h(8): error C2146: syntax error : missing ';' before identifier 'getName'
1>d:\c++\consoleapplication\consoleapplication\inventoryitem.h(8): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>d:\c++\consoleapplication\consoleapplication\inventoryitem.h(8): warning C4183: 'getName': missing return type; assumed to be a member function returning 'int'
1>d:\c++\consoleapplication\consoleapplication\inventoryitem.h(11): error C2146: syntax error : missing ';' before identifier 'name'
1>d:\c++\consoleapplication\consoleapplication\inventoryitem.h(11): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
-
April 3rd, 2013, 04:06 AM
#2
Re: error C2061: syntax error : identifier 'string'
You should #include <string> in InventoryItem.h and fully qualify string as std::string there.
I suggest that you don't use pre-compiled headers just yet, i.e., get rid of stdafx.h and disable pre-compiled headers. Later, when you are involved in creating much larger programs, the feature might become useful, but for now it is better to know which header is for what by practicing it. Anyway, you should not have a using directive at file scope in a header file, so get rid of the using namespace std; or move it to InventoryItem.cpp, after including the header(s).
Also, I suggest that you avoid #pragma once, or use it in addition to the more conventional #define header inclusion guards since #pragma once is not guaranteed to always be available, being fundamentally non-standard as a pragma.
-
April 3rd, 2013, 04:44 AM
#3
Re: error C2061: syntax error : identifier 'string'
Including string in InventoryItem.h indeed solved the errors.
As you suggested I stopped using pre-compiled headers, and removed using namespace std from all the headers I am using.
As for #pragma once, I'm not sure how I should approach changing it.
My program now runs with no errors but for some reason cout doesn't produce any output.
InventoryItem.h
Code:
#pragma once
#include <string>
class InventoryItem
{
public:
InventoryItem(std::string name, int amount);
~InventoryItem(void);
std::string getName(void);
int getAmount(void);
private:
std::string name;
int amount;
};
InventoryItem.cpp
Code:
#include "InventoryItem.h"
#include <string>
InventoryItem::InventoryItem(std::string name, int amount) : name(name), amount(amount) {}
InventoryItem::~InventoryItem(void) {}
std::string InventoryItem::getName(void)
{
return name;
}
main.cpp
Code:
#include "InventoryItem.h"
#include <iostream>
#include <string>
using namespace std;
int main() {
InventoryItem i ("Sword", 1);
cout << "Name: " << i.getName() << endl;
system("pause");
return 0;
}
-
April 3rd, 2013, 05:34 AM
#4
Re: error C2061: syntax error : identifier 'string'
Originally Posted by royibernthal
As for #pragma once, I'm not sure how I should approach changing it.
Look up what include guards are.
Please see below:
Code:
#ifndef INVENTORYITEM_H
#define INVENTORYITEM_H
#include <string>
class InventoryItem
{
public:
InventoryItem(const std::string& theName, int theAmount);
~InventoryItem();
std::string getName() const;
int getAmount() const;
private:
std::string name;
int amount;
};
#endif
Note the use of include guards. In addition, functions that do not change the members should be declared as const, and parameters such as strings should be passed by const reference, not by value.
Second, don't name your parameters the same as your member variables. That just leads to confusing code.
Code:
#include "InventoryItem.h"
InventoryItem::InventoryItem(const std::string& theName, int theAmount) : name(theName), amount(theAmount) {}
InventoryItem::~InventoryItem() {}
std::string InventoryItem::getName() const
{ return name;}
Code:
#include "InventoryItem.h"
#include <iostream>
using namespace std;
int main()
{
InventoryItem inv("Sword", 1);
cout << "Name: " << inv.getName() << endl;
return 0;
}
Finally, you should #include what the source file suggests that you #include. There is no usage of std::string in main.cpp, but you #included it -- there was no need to #include <string> in main.cpp. The InventoryItem.h file already takes care of what needed to be included for InventoryItem.
Regards,
Paul McKenzie
-
April 3rd, 2013, 05:56 AM
#5
Re: error C2061: syntax error : identifier 'string'
I understand, I've learned alot from your reply.
Is it very wrong to give parameters the same names as my member variables? Usually I used to do it just like you said, i.e parameter theAmount for memeber amount. I just thought it might produce nicer code hints while allowing me to work with clean member names.
I've read about the include guards and I now understand it, however I googled the issue and most people seem to favor #pragma once over include guards, less code to write, possibly faster and avoids possible future name conflicts. Even though it is technically non standard, from what I understand it is supported by any modern compiler. Correct me if I'm wrong I'm pretty much quoting what I've read.
Regardless, I still see no output.
Thanks.
-
April 3rd, 2013, 06:19 AM
#6
Re: error C2061: syntax error : identifier 'string'
Regardless, I still see no output.
What debugging have you done with the debugger? What happens when you step through the program using the debugger? Has the code actually compiled and linked properly to produce an executable program? To make sure you are producing a working program, try this
Code:
#include "InventoryItem.h"
#include <iostream>
using namespace std;
int main()
{
//InventoryItem inv("Sword", 1);
//cout << "Name: " << inv.getName() << endl;
cout << "hello world!" << endl;
return 0;
}
If you still see no output then you have a whole different problem!
All advice is offered in good faith only. All my code is tested (unless stated explicitly otherwise) with the latest version of Microsoft Visual Studio (using the supported features of the latest standard) and is offered as examples only - not as production quality. I cannot offer advice regarding any other c/c++ compiler/IDE or incompatibilities with VS. You are ultimately responsible for the effects of your programs and the integrity of the machines they run on. Anything I post, code snippets, advice, etc is licensed as Public Domain https://creativecommons.org/publicdomain/zero/1.0/ and can be used without reference or acknowledgement. Also note that I only provide advice and guidance via the forums - and not via private messages!
C++23 Compiler: Microsoft VS2022 (17.6.5)
-
April 3rd, 2013, 06:28 AM
#7
Re: error C2061: syntax error : identifier 'string'
I'm working with a console application. The code is compiled and the black console pops up. I just see no output there.
I did however notice this, which might be related to my problem:
Last edited by royibernthal; April 3rd, 2013 at 06:53 AM.
-
April 3rd, 2013, 12:53 PM
#8
Re: error C2061: syntax error : identifier 'string'
Originally Posted by royibernthal
I'm working with a console application. The code is compiled and the black console pops up. I just see no output there.
Look at that little yellow arrow. That means that you haven't executed your main() function yet, so of course you won't see any output. The debugger is waiting for you to "get started".
Hit F10, then do that several more times, and watch the arrow move.
Regards,
Paul McKenzie
-
April 3rd, 2013, 06:51 AM
#9
Re: error C2061: syntax error : identifier 'string'
Sorry, your screen shot is completely unreadable. What is it saying?
All advice is offered in good faith only. All my code is tested (unless stated explicitly otherwise) with the latest version of Microsoft Visual Studio (using the supported features of the latest standard) and is offered as examples only - not as production quality. I cannot offer advice regarding any other c/c++ compiler/IDE or incompatibilities with VS. You are ultimately responsible for the effects of your programs and the integrity of the machines they run on. Anything I post, code snippets, advice, etc is licensed as Public Domain https://creativecommons.org/publicdomain/zero/1.0/ and can be used without reference or acknowledgement. Also note that I only provide advice and guidance via the forums - and not via private messages!
C++23 Compiler: Microsoft VS2022 (17.6.5)
-
April 3rd, 2013, 06:53 AM
#10
Re: error C2061: syntax error : identifier 'string'
-
April 3rd, 2013, 10:19 AM
#11
Re: error C2061: syntax error : identifier 'string'
Originally Posted by royibernthal
Is it very wrong to give parameters the same names as my member variables?
It is not wrong, but it increases the potential for confusion. In this case I consider them fine since they are only used in the constructor to initialise the member variables, but if you used them in the body of the constructor or some other member function, then I would agree with Paul McKenzie.
Originally Posted by royibernthal
I've read about the include guards and I now understand it, however I googled the issue and most people seem to favor #pragma once over include guards, less code to write, possibly faster and avoids possible future name conflicts. Even though it is technically non standard, from what I understand it is supported by any modern compiler. Correct me if I'm wrong I'm pretty much quoting what I've read.
I doubt that your "most people" conclusion is accurate. There are pros and cons involved here. The main disadvantage for conventional include guards is that you have to invent a unique name. The speed issue is generally a non-issue as long as the include guard is the first thing in the file, and "less code to write" is somewhat bogus since we are talking about three lines. The main advantage of #pragma once is that it avoids the unique name problem, with the disadvantage of being non-standard and having no real certainty that the compiler implements it correctly since it may have to deal with file paths across differing file systems and such.
-
April 3rd, 2013, 10:29 AM
#12
Re: error C2061: syntax error : identifier 'string'
Yes I agree with you, I only intend to use it in order to initialize the member variables I have no intention of causing further confusion in the rest of my code.
If I do end up using the properties in the constructor, is adding a "_" prefix a conventional way? I've been adding a "the" and "my" prefix for quite a while now and I'm trying to find a better way of doing it.
Okay, so if I understand correctly the include guards are the safe way to go.
-
April 4th, 2013, 02:33 AM
#13
Re: error C2061: syntax error : identifier 'string'
You are right, but I don't understand. Why isn't it all executed automatically? I doubt it's ideal for me to have to press F10 many times every time I test my program.
-
April 4th, 2013, 06:15 AM
#14
Re: error C2061: syntax error : identifier 'string'
Originally Posted by royibernthal
You are right, but I don't understand. Why isn't it all executed automatically? I doubt it's ideal for me to have to press F10 many times every time I test my program.
That is exactly what the debugger is for, and that is to run your program a step at a time. How are you going to figure out where a bug is located or how your program flows if you aren't able to control the "speed" of your program?
That arrow is telling you the next line that will be executed. What if your program were 10,000 lines long and contained 1,000 functions? What good would it be to run a program at full speed if there is a bug in function X or on line 278? How would you tell the program to "stop here and let me look what is going on"?
The debugger allows you to run your program a step at a time, inspect variables, look at the flow of the program, set breakpoints, etc.
Regards,
Paul McKenzie
-
April 4th, 2013, 06:10 AM
#15
Re: error C2061: syntax error : identifier 'string'
You could set one or more break points and then press F5 to jump from one point to the next.
Or just run your code without debugging!
Victor Nijegorodov
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|