Конфликт двух классов в разных пространствах имён C++

148
13 февраля 2022, 16:20

Есть два класса с одинаковыми именами, которые находятся в разных файлах ( но с одинаковыми названиями ) в разных папках. Классы обёрнуты в разные пространства имён, и, читая ответы на другие вопросы, конфликта между ними не должны произойти. Но при компиляции выдаёт ошибку "Ссылка на неразрешённый символ" на конструктор одного из классов. Также, если я уберу определение одного из классов нажимая на "Перейти к определению" он перебрасывает меня другому классу ( в Visual Studio 2019 ). Что я делаю не так?

Вот примерно ситуация

// Folder1/file.h
namespace A
{
    class Test
    {
    public:
        Test();
    }
}
// Folder1/file.cpp
#include "file.h"
A::Test::Test()
{
    // Определение
}
// Folder2/file.h
namespace B
{
    class Test
    {
    public:
        Test();
    }
}
// Folder2/file.cpp
#include "file.h"
B::Test::Test()
{
   // Другое определение
}
A::Test test1 = A::Test();  // Работает
//B::Test test2 = B::Test();  // Если раскомментировать, будет ошибка 

И вот скрин ( Как видно, открылось определение класса в другом namespace, а слева структура проекта ), возможно он прояснит ситуацию

Answer 1

Visual Studio при сборке генерирует объектные файлы для каждой единицы трансляции в промежуточной папке сборки (Intermediate Directory) независимо от нахождения .cpp файла этой единицы трансляции в иерархии папок и выбирает для них имя <имя_исходного_файла_без_расширения.obj>. Соответственно имена единиц трансляции необходимо выбирать уникальными в рамках одного проекта, даже если они располагаются в разных папках, иначе будете получать конфликты и прочие проблемы при сборке.

READ ALSO
синтаксис в шаблонном классе

синтаксис в шаблонном классе

у нас есть только шаблон Vector<T> те

120
thread.join() Почему потоки вызываются в случайном порядке? С++

thread.join() Почему потоки вызываются в случайном порядке? С++

Пытаюсь разобраться в многопоточности и mutexПо задумке сначала должен выполниться thread Calc(Stream), после его окончания должен выполниться thread...

162
Ругается компилятор

Ругается компилятор

Ошибка компиляции на cols во вложенном цикле:

88