#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