Почему использование пространства имен нарушает компиляцию MinGW?

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

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.

0

Решение

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

Подпись вашей функции будет 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) { ... }
4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]