В чем разница между этими двумя заголовками?

#c #header-files

#c #заголовочные файлы

Вопрос:

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

Комментарии:

1. Разница между двумя фрагментами кода, которые у вас есть в вашем вопросе, заключается в том, что второй фрагмент кода не должен компилироваться. Я получаю ошибки «C4430: отсутствует спецификатор типа» в Visual C для всех экземпляров string вашего второго фрагмента кода. Что еще вы включаете? Какой компилятор вы используете?

2. Вы также должны включить некоторые другие заголовки. Просто предполагаю, что один из них содержит using namespace std .

3. Честно говоря, я не уверен. Все, что встроено в Visual Studio 2010. Есть ли способ это проверить?

4. Скорее всего, вы используете Visual C , поэтому это не может быть ошибкой компилятора, поскольку я получаю C4430 ошибки для второго фрагмента кода. Есть ли using namespace std или using std::string в каком-либо из ваших заголовочных файлов?

Ответ №1:

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

 using namespace std;
  

Комментарии:

1. Проблема OP именно в том, почему опытные программисты на C не рекомендуют помещать using namespace std; в заголовочные файлы!

2. 1 тому, кто это написал, следует оказать честь удалить все подобные объявления из репозитория и исправить сборки в процессе.

3. Это было оно! Просмотрев несколько файлов заголовков, я нашел это. Я прокомментировал это, чтобы протестировать, и, конечно же, мой второй фрагмент кода теперь не будет компилироваться без std ::. Спасибо!

Ответ №2:

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

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

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