【问题标题】:Declaring strings as std:string in C++在 C++ 中将字符串声明为 std:string
【发布时间】:2013-04-20 12:36:07
【问题描述】:

这是基于 GCC/G++ 并且通常在 Ubuntu 上。

这是我完成的示例程序:

#include <iostream>

using namespace std;

int main()
{
    std::string c = "Test";
    cout << c;
    return 0;
}

上面的代码运行良好。

但我有两个问题我不太明白......

  1. 将字符串声明写为std:string(带有一个:)也可以正常工作。有什么区别?

  2. 如果我在类中使用std:string(带有一个:)来声明私有变量,则会收到错误错误:'std' 没有命名类型。此声明的示例:

class KType
{
private:
    std:string N;
};

谁能解释一下这些问题? 非常感谢!

【问题讨论】:

    标签: c++ string private-members


    【解决方案1】:

    将字符串声明写为 std:string 也可以正常工作。有什么区别。

    如果格式不同,差异会更明显:

    std:
        string c = "Test";
    

    您正在声明一个名为std标签,并使用名称string,该名称已被using namespace std; 转储到全局命名空间中。将其正确写为 std::string,您使用的是来自 std 命名空间的名称 string

    如果我在类中使用此std::string 来声明私有变量,则会收到错误错误:‘std’ does not name a type.

    这是因为您不能在类定义中放置标签,只能在代码块中。你必须在那里正确地写成std::string。 (如果类是在头文件中定义的,那么using namespace std 是比在源文件中更糟糕的主意,所以我劝你不要这样做。)

    另外,如果您使用的是std::string,那么您应该使用#include &lt;string&gt;。由于&lt;iostream&gt; 引入的定义比它需要的多,您的代码似乎意外地工作了,但您不能便携地依赖它。

    【讨论】:

    • 如果我“以不同的方式格式化它”的例子很漂亮。谢谢!很有道理:)
    【解决方案2】:

    你需要包含字符串类头:

    #include <string>
    

    这段代码有错别字,缺少第二个冒号

    std:string N;
    

    应该是:

    std::string N;
    

    用一个冒号,它变成了 goto 的标签,这可能不是你的意思。

    【讨论】:

    • @Matt-Petersson 感谢您的意见。我试过了,但它是一样的。它确实适用于第一个示例。所以我不明白为什么第二个需要字符串:(
    • 这不是错字。相反,我认为这是正确的,因为它在第一个示例中之前有效。但我现在看到Mike-Seymour 的解释后有区别。感谢您抽出宝贵时间!
    【解决方案3】:

    第一个问题:

    首先,您缺少#include &lt;string&gt; 指令。您不能将其他标头(例如&lt;iostream&gt;)自动依赖于#include &lt;string&gt; 标头。除此之外:

    第二个问题:

    将字符串声明写为 std:string 也可以正常工作。有什么区别。

    那是因为你在全局命名空间范围内有一个(邪恶的)using 指令:

    using namespace std;
    

    该指令的效果是将来自std 命名空间的所有名称都导入到全局命名空间中。这就是为什么完全合格的std::string 和不合格的string 解析为相同的类型。

    如果您省略了 using namespace std; 指令,则在使用不合格的 string 名称时会出现编译器错误。

    第三题:

    如果我在一个类中使用这个 std::string 来声明一个私有变量,我会得到一个错误错误:“std”没有命名一个类型。此声明的示例:

    您缺少一个冒号。那应该是:

    std::string
    //  ^
    

    不是

    std:string
    // ^
    

    【讨论】:

    • 你说:namespace are imported into the global namespace。那么为什么会这样呢?原谅我的无知;)和很好的解释+1
    • @itsols:当心,引用与您的摘录似乎暗示的略有不同;) 导入到全局的是来自 std 命名空间的 names命名空间。这不好的原因是您可能会在属于全局命名空间的名称和导入到全局命名空间的名称之间出现名称冲突。
    【解决方案4】:

    将字符串声明写为 std:string 也可以正常工作。有什么区别。

    没有区别,除非您声明其他名称为string。在您的代码中,stringstd::string 指的是同一类型。但要不惜一切代价避免using namespace std

    如果我在一个类中使用这个 std::string 来声明一个私有变量,我会得到一个错误错误:“std”没有命名一个类型。此声明的示例:

    您需要#include &lt;string&gt; 才能使用std::string。发生的情况是,在您的第一个代码示例中,&lt;iostream&gt; 似乎包含&lt;string&gt;。你不能依赖它。您必须包含&lt;string&gt;

    【讨论】:

    • @MikeSeymour 不用担心。我想现在一切都已经解决了。
    • @juanchopanza 不错:There is no difference, unless you declare something else called string。然后有光:) +1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-03
    • 2010-12-31
    • 1970-01-01
    • 2013-02-18
    相关资源
    最近更新 更多