Реализация пространства имен без класса в C ++ - PullRequest
0 голосов
/ 12 февраля 2020

Должно быть, это простой вопрос, но сейчас я пытаюсь в течение часа обернуть некоторые вспомогательные функции в пространство имен. Так как мне нужны вспомогательные функции, которые не обязательно должны быть внутри класса, я рекомендовал заключить их в пространство имен вместо того, чтобы делать их все stati c. См. Также здесь: http://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines

Проблема в том, что, что бы я ни делал, я сталкиваюсь с различными ошибками. Итак, как правильно писать функции с собственным пространством имен без создания класса? Давайте возьмем следующий пример. Я уже пробовал разные варианты этого.

Мой заголовочный файл:

#ifndef BINARYCONVERTER_HPP
#define BINARYCONVERTER_HPP

#include <iostream>

namespace binary_converter {
    int myFunction(void);
}

#endif

И мой исходный файл:

#include "binary_converter.hpp"

int myFunction(void) {
    return true;
}

Спасибо!

1 Ответ

6 голосов
/ 12 февраля 2020

Как сказано в C ++ документах :

Символы, объявленные внутри блока пространства имен, помещаются в именованную область видимости, что предотвращает их ошибочное принятие за символы с одинаковыми именами в других scopes.

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

Поэтому вам необходимо заключить в функцию

int myFunction() {
    return 0;
}

из Исходный файл в пространство имен binary_converter, например:

namespace binary_converter {
    int myFunction() {
        return 0;
    }
}

или используйте оператор области действия, чтобы заметить, что myFunction принадлежит пространству имен binary_converter, например:

int binary_converter::myFunction() {
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...