Рассмотрим следующий сценарий:
Source.cpp
int add(int a, int b) { return a + b; } // function in global scope
Header.h
namespace ns
{
class A
{
public:
void do()
{
...
...
method();
...
...
}
private:
int method()
{
...
...
int add(int a, int b); // forward declaration
auto result = add(5, 10); // function call
...
...
// do something with result
}
};
}
Вкл. Windows (MS Compiler) вышеописанное работает, как и ожидалось.
В Linux (GCC) это приводит к ошибке компоновщика, при которой метод add()
сообщается как неопределенная ссылка .
Более того, ошибка указывает, что компилятор пытается найти add()
в пространстве имен ns
, но он четко определен в глобальном пространстве имен.
Включает ли GCCLinux ведет себя иначе, чем компилятор MS в Windows, когда связываете методы, которые объявлены вперед?Как мне решить эту проблему?