В процессе отделения набора функций, связанных с вводом и выводом, от других частей программы, я столкнулся с проблемой компиляции файлов, когда функции в заголовке помещаются в пространство имен. Компилируются следующие файлы:
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.
Если вы измените объявление своей функции, чтобы оно находилось в пространстве имен, вам нужно также реализовать функцию в этом пространстве имен.
Подпись вашей функции будет 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) { ... }
Других решений пока нет …