string in namespace std does not name a type
Asked Answered
B

5

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;
}
Branton answered 7/8, 2012 at 20:44 Comment(5)
Why use a switch when an array would work beautifully?Remittance
@TheZ: Why not #include the things you want to use? I suspect these questions have the same answer...Sclerosed
switch is what I'm ised to using. Personal preference. And to me it looks neater.Branton
@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 :)Remittance
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.Branton
S
107

You need to

#include <string>

<iostream> declares cout, cin, not string.

Selie answered 7/8, 2012 at 20:46 Comment(7)
<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.Harold
@ErnestFriedman-Hill I've never seen iostream including string... And including string in nouns.h is the correct approach here, not outside.Selie
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...Branton
@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.Indict
@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.Harold
And for sure, including <string> in Nouns.h is the right fix.Harold
@ErnestFriedman-Hill that's enough for anything including iostream to compile, because ios_base & string are used as parameters to << and >>. But not enough to use it anywhere meaningful (like a member of a class, where a full definition is required). But yeah, I missed that you said declares, not includes. ;)Selie
H
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.

Harold answered 7/8, 2012 at 20:46 Comment(0)
C
4

You need to add:

#include <string>

In your header file.

Chaulmoogra answered 7/8, 2012 at 20:46 Comment(0)
S
0

Notice

#include <string.h>

is not

#include <string>
Scissors answered 18/5, 2023 at 16:30 Comment(0)
T
-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.

Tandi answered 22/3, 2021 at 10:8 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.