Почему использование пространства имен нарушает компиляцию MinGW? - PullRequest
0 голосов
/ 04 января 2019

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

main.cpp

#include "IO.h"
int main()
{
    testFunction("yikes");
}

IO.h

#ifndef IO_H_INCLUDED
#define IO_H_INCLUDED
#include <string>
void testFunction(const std::string &text);
#endif    

Однако, когда testFunction помещается в пространство имен:

#ifndef IO_H_INCLUDED
#define IO_H_INCLUDED
#include <string>

// IO.h
namespace IO
{
    void testFunction(const std::string &text);
}
#endif

в IO.h, а затем вызывается как IO::testFunction, сборка не удалась, выбросить

undefined reference to `IO::testFunction(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
collect2.exe: error: ld returned 1 exit status`

В каждом случае IO.cpp равен

#include <string>
#include <iostream>
void testFunction(const std::string &text)
{
    std::cout << text << std::endl;
}

, а команда компиляции - g++ -std=c++11 main.cpp IO.cpp, с компилятором x86_64-w64-mingw32 из TDM-GCC, наWindows 10 Home.

1 Ответ

0 голосов
/ 04 января 2019

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

Подпись вашей функции будет IO::testFunction(...), но вы реализовали только testFunction(...)поэтому не существует реализации для IO::testFunction(...)

Заголовочный файл (IO.h):

namespace IO {
    void testFunction(const std::string &text);
}

Файл cpp (IO.cpp):

#include "IO.h"

// either do this
namespace IO {
    void testFunction(const std::string &text) { ... }
    // more functions in namespace
}


// or this
void IO::testFunction(const std::string &text) { ... }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...