Рассмотрим этот файл first.cpp
, содержащий определение класса и использующий:
#include <iostream>
struct Foo
{
Foo(){ std::cout << "Foo()" << std::endl; }
~Foo(){ std::cout << "~Foo()" << std::endl; }
};
int main(){
Foo f;
return 0;
}
и другой, second.cpp
, содержащий определение конфликтующего класса:
#include <iostream>
struct Foo
{
Foo();
~Foo();
};
Foo::~Foo(){ std::cout << "wrong ~Foo()" << std::endl; }
Компоновщик жалуется на дубликаты символов, когда есть две функции с одинаковыми именами, но эти файлы с методами повторяющихся классов компилируются без ошибок.
Я скомпилировал эти команды:
$ g++ -c second.cpp -o second
$ g++ second first.cpp -o first
Переупорядочение аргументов второму вызову g++
не изменяет результат.
И когда выполняется first
, это будет выход:
$ ./first
Foo()
wrong ~Foo()
Почему компоновщик допускает методы дублирования класса? Если это разрешено, почему печатается wrong ~Foo()
?