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;
}
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.

Sign up to request clarification or add additional context in comments.

7 Comments

<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.
@ErnestFriedman-Hill I've never seen iostream including string... And including string in nouns.h is the correct approach here, not outside.
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...
@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.
@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.
|
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.

Comments

4

You need to add:

#include <string>

In your header file.

Comments

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>

1 Comment

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.
-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.

Comments

Your Answer

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