C ++ std :: и включить, как они сочетаются друг с другом? - PullRequest
0 голосов
/ 09 мая 2018

Я в замешательстве. Я написал функцию с именем hash (), и я использую пространство имен std для cout, endl и laziness.

Ошибка ссылки на «хэш» неоднозначна

Теперь я знаю, что в std ::

существует хеш-функция

Итак, мой вопрос, почему компилятор выдает эту ошибку, потому что я никогда не включал функционал .h?

Есть ли где-нибудь индекс имен из std ::, чтобы я мог избежать этих имен в будущем, когда я пишу свои собственные функции, я ничего не могу найти с помощью Google?

Я в замешательстве из-за того, что "все" известно в std :: зачем нужно включать заголовки? Я уверен, что мне чего-то не хватает

Может быть, мой титул не самый лучший, но я не знаю лучше.

#include <iostream>
using namespace std;

const int SIZE_TABLE = 10;

int hash(int x)
{
    return x%SIZE_TABLE;
}

int main()
{
    cout<<"hash 24 "<<hash(24)<<endl;
    return 0;
}

Ответы [ 3 ]

0 голосов
/ 09 мая 2018

почему компилятор выдает эту ошибку, потому что я никогда не включал функционал .h?

using namespace std;

Поскольку у вас это есть в глобальном пространстве имен, вы загрязняете глобальное пространство имен .

Точно не определено, сколько символов вы вносите в глобальное пространство имен. Заголовок может включать другие заголовки, а также определять недокументированные символы.

Вы также добавляете свои собственные символы в то же пространство имен. Любой из ваших глобальных символов может сталкиваться с символом, определенным в пространстве имен std.

Урок: Просто не делайте этого, и у вас не будет этой проблемы.

0 голосов
/ 10 мая 2018

Компилятор пытается получить правильную хеш-функцию. Ваша хеш-функция реализована в глобальном пространстве имен с адресом ::

::hash(1)

В обычных случаях компилятор использует это пространство имен, если вы вызываете его с помощью

hash(1)

Но вы говорите компилятору: "Эй, чувак, ищи каждый вызов также в std ::" с:

using namespace std;

так что он не может определиться с

::hash(1)
and
std::hash(1)

использование в глобальной области действия является проблемой в заголовочных файлах, поскольку вы импортируете эту директиву в другие файлы, которые включают в себя ваш заголовочный файл.

В файлах cpp это дело вкуса. Я также предпочитаю не использовать его в cpp.

0 голосов
/ 09 мая 2018

Шаг первый, не делайте этого: using namespace std;. Вы добавляете все имена стандартной библиотеки (по крайней мере, те, которые видит ваша прямая и включает транзитивная ), и просто так получается, что std::hash это вещь, которая заканчивается столкновением с вашим собственным hash.

Если вы вместо этого не извлекаете все std, но либо явно ссылаетесь на std с префиксом std::, либо просто извлекаете вещи, которые вы на самом деле хотите (скажем, std::vector) с чем-то вроде using std::vector;, тогда у вас не будет этой проблемы.

Пространства имен существуют для разделения символов с одинаковыми именами на отдельные домены / блоки. Использование using namespace foo; побеждает это.

Конкретно отвечая, почему std::hash вводится, несмотря на то, что он не включает непосредственно его заголовок: какой-то другой заголовок, который вы делаете , включает его или включает какой-то другой заголовок, который, в свою очередь, включает его и т. Д. - переходный включает.

...