69

I am receiving the error: identifier "string" undefined.

However, I am including string.h and in my main file, everything is working fine.

CODE:

#pragma once
#include <iostream>
#include <time.h>
#include <string.h>

class difficulty
{
private:
    int lives;
    string level;
public:
    difficulty(void);
    ~difficulty(void);

    void setLives(int newLives);
    int getLives();

    void setLevel(string newLevel);
    string getLevel();
};

Can someone please explain to me why this is occurring?

Rhexis
  • 2,194
  • 3
  • 26
  • 38
  • 3
    As a side comment, you should use include guards in your code. If your compiler does better with the `#pragma once` directive, combine the two: `#ifndef XXX_HEADER // #define XXX_HEADER // #pragma once // ... // #endif` where the order is important (i.e. include guard enclosing the pragma) – David Rodríguez - dribeas Aug 22 '11 at 12:00

7 Answers7

117

<string.h> is the old C header. C++ provides <string>, and then it should be referred to as std::string.

Puppy
  • 141,834
  • 35
  • 244
  • 454
  • 12
    Don't `using namespace std`, I've already downvoted all the answers that recommend that for a reason. – Puppy Mar 29 '16 at 13:35
21

You want to do #include <string> instead of string.h and then the type string lives in the std namespace, so you will need to use std::string to refer to it.

Jeankowkow
  • 784
  • 11
  • 30
Flexo
  • 84,884
  • 22
  • 182
  • 268
12

You forgot the namespace you're referring to. Add

using namespace std;

to avoid std::string all the time.

m0skit0
  • 23,973
  • 11
  • 79
  • 120
10

Because string is defined in the namespace std. Replace string with std::string, or add

using std::string;

below your include lines.

It probably works in main.cpp because some other header has this using line in it (or something similar).

Ernest Friedman-Hill
  • 79,064
  • 10
  • 147
  • 183
5

Perhaps you wanted to #include<string>, not <string.h>. std::string also needs a namespace qualification, or an explicit using directive.

Nicol Bolas
  • 413,367
  • 61
  • 711
  • 904
4

You must use std namespace. If this code in main.cpp you should write

using namespace std;

If this declaration is in header, then you shouldn't include namespace and just write

std::string level;
Camelot
  • 87
  • 3
2

#include <string> would be the correct c++ include, also you need to specify the namespace with std::string or more generally with using namespace std;

Pierre Lacave
  • 2,500
  • 2
  • 18
  • 28