Declaring strings as std:string in C++

前端 未结 4 1630
花落未央
花落未央 2021-01-15 05:54

This is based on GCC/G++ and usually on Ubuntu.

Here\'s my sample program I\'ve done:

#include 

using namespace std;

int main()
{
          


        
相关标签:
4条回答
  • 2021-01-15 06:04

    You need to include the string class header:

    #include <string>
    

    This code has a typo, missing a second colon

    std:string N;
    

    should be:

    std::string N;
    

    With a single colon, it becomes a label for goto, which is probably not what you meant.

    0 讨论(0)
  • 2021-01-15 06:06

    Writing the string declaration as std:string also works fine. What's the difference.

    There is no difference, unless you declare something else called string. In your code, string and std::string refer to the same type. But avoid using namespace std at all cost.

    If I use this std::string within a class to declare a private variable, I get an error error: ‘std’ does not name a type. Example of this declaration:

    You need to #include <string> in order to use std::string. What is happening is that in your first code sample, <iostream> seems to be including <string>. You cannot rely on that. You must include <string>.

    0 讨论(0)
  • 2021-01-15 06:13

    Writing the string declaration as std:string also works fine. What's the difference.

    The difference would be slight clearer if you formatted it differently:

    std:
        string c = "Test";
    

    You're declaring a label called std, and using the name string which has been dumped into the global namespace by using namespace std;. Writing it correctly as std::string, you're using the name string from the std namespace.

    If I use this std::string within a class to declare a private variable, I get an error error: ‘std’ does not name a type.

    That's because you can't put a label in a class definition, only in a code block. You'll have to write it correctly as std::string there. (If the class is defined in a header, then using namespace std is an even worse idea than in a source file, so I urge you not to do that.)

    Also, if you're using std::string, then you should #include <string>. It looks like your code works by accident due to <iostream> pulling in more definitions than it need to, but you can't portably rely on that.

    0 讨论(0)
  • 2021-01-15 06:22

    First problem:

    First of all, you are missing the #include <string> directive. You cannot rely on other headers (such as <iostream>) to #include the <string> header automatically. Apart from this:

    Second problem:

    Writing the string declaration as std:string also works fine. What's the difference.

    That is because you have an (evil) using directive at global namespace scope:

    using namespace std;
    

    The effect of this directive is that all names from the std namespace are imported into the global namespace. This is why the fully-qualified std::string and the unqualified string resolve to the same type.

    If you omitted that using namespace std; directive, you would get a compiler error when using the unqualified string name.

    Third problem:

    If I use this std::string within a class to declare a private variable, I get an error error: ‘std’ does not name a type. Example of this declaration:

    You are missing a colon. That should be:

    std::string
    //  ^
    

    And not

    std:string
    // ^
    
    0 讨论(0)
提交回复
热议问题