В чем разница между этими двумя заголовками? - PullRequest
1 голос
/ 28 апреля 2011

У меня есть эти два заголовочных файла, и один выдает ошибку, если я не ставлю 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 ]

8 голосов
/ 28 апреля 2011

Второй файл включен после некоторого другого, который определяет

using namespace std;
2 голосов
/ 28 апреля 2011

string объявлено в namespace std.Таким образом, нужно использовать пространство имен std, чтобы использовать строку.это можно сделать двумя способами:

Явно указав, какой тип (в данном случае строку) вы хотите включить из пространства имен std, как в случае 1, std::string colors
ИЛИ
Включиввсе пространство имен std, using namespace std;, которое импортирует все типы из пространства имен в вашем глобальном пространстве имен (обратите внимание, что делать это в заголовках не рекомендуется)

Во втором случае кажется, что вы включили все пространство имен stdперед конкретным включением и, следовательно, оно не выдает ошибку даже без явного упоминания std::String

...