这两个标题有什么区别?

时间:2011-04-28 04:46:36

标签: c++ header-files

我有这两个头文件,如果我没有将std::放在所有字符串声明之前而另一个没有,则会产生错误。我只是想知道两者之间有什么区别。

如果std::不在字符串声明之前,以下内容将产生错误:

#include <string>
#include <vector>

#pragma once

#ifndef DATABASE_H
#define DATABASE_H

struct Item
{
    public:
        std::string object;

        int numOfColors;
        std::string colors;

        int sizeSmall;
        int sizeLarge;
};

class database
{
private:
    void fillDatabase(std::vector<Item>);
public:
    void getDatabase(std::vector<Item>);
};

#endif

以下代码不会产生错误:

#include <string>

#pragma once

#ifndef GUISTRUCT_H
#define GUISTRUCT_H

struct guiValues
{
    public:
        string shape;
        string color;
        int width;
        double squareProbability;
        double rectangleProbability;
        double circleProbability;

        string firstMostLikelyObject;
        double FMLOprobability;
        string secondMostLikelyObject;
        double SMLOprobability;
        string thirdMostLikelyObject;
        double TMLOprobability;

};

#endif

2 个答案:

答案 0 :(得分:8)

第二个文件包含在定义

的其他文件之后
using namespace std;

答案 1 :(得分:2)

stringnamespace std中声明。因此,需要使用命名空间std来使用字符串。它可以通过两种方式完成:

通过明确提及要在std命名空间中包含哪种类型(在本例中为字符串),如情况1,std::string colors
OR
通过启用整个std命名空间,using namespace std;从全局命名空间中的命名空间导入所有类型。(请注意,不建议在标题中执行此操作)

在第二种情况下,您似乎已经在特定包含之前包含了整个std命名空间,因此即使没有提及std::String

也没有给出错误