64

This may just be a simple mistake that I'm not seeing, but I think I'm simply doing something wrong. Don't worry I'm not using namespace std in my header functions or anything which seemed to be this person's issue [Question I read similar to mine][1] [1]: Why am I getting string does not name a type Error?

I am getting 4 errors right now:

C:\Documents and Settings\Me\My Documents\C++Projects\C++\RandomSentence\Nouns.h|8|error: 'string' in namespace 'std' does not name a type|

C:\Documents and Settings\Me\My Documents\C++Projects\C++\RandomSentence\Nouns.h|12|error: 'string' in namespace 'std' does not name a type|

C:\Documents and Settings\Me\My Documents\C++Projects\C++\RandomSentence\Nouns.h|13|error: 'string' in namespace 'std' does not name a type|

C:\Documents and Settings\Me\My Documents\C++Projects\C++\RandomSentence\Nouns.cpp|9|error: no 'std::string Nouns::nounGenerator()' member function declared in class 'Nouns'|

||=== Build finished: 4 errors, 0 warnings ===|

Here is my header file:

class Nouns
{
 public:
 Nouns();
 std::string noun;
 protected:
 private:
 int rnp; // random noun picker
 std::string dog, cat, rat, coat, toilet, lizard, mime, clown, barbie, pig, lamp, chair, hanger, pancake, biscut, ferret, blanket, tree, door, radio;
 std::string nounGenerator()
};

And this is my cpp file:

#include "Nouns.h"
#include <iostream>
Nouns::Nouns()
{
}
std::string Nouns::nounGenerator(){
 RollRandom rollRandObj;
 rnp = rollRandObj.randNum;
 switch(rnp){
 case 1:
 noun = "dog";
 break;
 case 2:
 noun = "cat";
 break;
 case 3:
 noun = "rat";
 break;
 case 4:
 noun = "coat";
 break;
 case 5:
 noun = "toilet";
 break;
 case 6:
 noun = "lizard";
 break;
 case 7:
 noun = "mime";
 break;
 case 8:
 noun = "clown";
 break;
 case 9:
 noun = "barbie";
 break;
 case 10:
 noun = "pig";
 break;
 case 11:
 noun = "lamp";
 break;
 case 12:
 noun = "chair";
 break;
 case 13:
 noun = "hanger";
 break;
 case 14:
 noun = "pancake";
 break;
 case 15:
 noun = "biscut";
 break;
 case 16:
 noun = "ferret";
 break;
 case 17:
 noun = "blanket";
 break;
 case 18:
 noun = "tree";
 break;
 case 19:
 noun = "door";
 break;
 case 20:
 noun = "radio";
 break;
 }
 return noun;
}
ROMANIA_engineer
57k30 gold badges211 silver badges207 bronze badges
asked Aug 7, 2012 at 20:44
5
  • 2
    Why use a switch when an array would work beautifully? Commented Aug 7, 2012 at 20:46
  • 2
    @TheZ: Why not #include the things you want to use? I suspect these questions have the same answer... Commented Aug 7, 2012 at 20:48
  • switch is what I'm ised to using. Personal preference. And to me it looks neater. Commented Aug 7, 2012 at 20:53
  • @NekkoRivera Well, now you have the chance every programmer gets once in a while: make more efficient/extensible code, or stick to your old ways :) Commented Aug 7, 2012 at 20:54
  • 1
    Once I get the program working (there are other errors in other parts of the code that I can probably fix myself) I will try to change the switch statement into an array. It'll probably take up less room and make the program easier to work with. Commented Aug 7, 2012 at 21:00

5 Answers 5

107

You need to

#include <string>

<iostream> declares cout, cin, not string.

answered Aug 7, 2012 at 20:46
7
  • 2
    <iostream> probably indirectly declares string (in most versions, anyway) but note that he's including it after Nouns.h is already processed. Although this wouldn't be the best solution, reversing the order of the two includes would probably fix the problem as well. Of course, this would come up again everywhere else Nouns.h was included, so it's better to include <string> in that file. Commented Aug 7, 2012 at 20:48
  • 1
    @ErnestFriedman-Hill I've never seen iostream including string... And including string in nouns.h is the correct approach here, not outside. Commented Aug 7, 2012 at 20:49
  • Oops... I sware I spent atleast 30 minutes staring at the code trying to figure out what was wrong. Simple things are easily overlooked. Thank you... Commented Aug 7, 2012 at 20:51
  • @LuchianGrigore: If I recall, MSVC's iostream includes enough of string for it to work in some but not all contexts, leading to much confusion. Commented Aug 7, 2012 at 20:54
  • @LuchianGrigore -- note that I didn't say includes, but declares. For example, on my system (gcc 4.0), iostream includes ostream which includes ios which includes iosfwd which includes bits/stringfwd.h which forward-declares std::string. Commented Aug 7, 2012 at 20:57
9

Nouns.h doesn't include <string>, but it needs to. You need to add

#include <string>

at the top of that file, otherwise the compiler doesn't know what std::string is when it is encountered for the first time.

answered Aug 7, 2012 at 20:46
4

You need to add:

#include <string>

In your header file.

answered Aug 7, 2012 at 20:46
2

Notice

#include <string.h>

is not

#include <string>

The difference being

// C and C++ include "old" C-style string functions such as strlen, strcmp
#include <string.h>

on the other hand

 // C++ only for the "new" features of the string class named std::string
 #include <string>
answered May 18, 2023 at 16:30
1
  • well i will be dammed, all the other answers state the obvious and i new i had already included <string.h> and the code runs on my Raspberry Pi Pico but wont run on Ubuntu and for the life of me i couldn't understand why. Having zero votes i dident hold out hope this would make any difference but tried it anyway and my problem is fixed so you have my upvote. i wish you would update this answer as to what the difference actually is. Commented Oct 4, 2024 at 7:15
-2

You need to add

#include <string>

Here you are trying to access string noun:: but made no namespace named string noun. You are trying to access a private file.

Obsidian
3,9328 gold badges20 silver badges33 bronze badges
answered Mar 22, 2021 at 10:08

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.