Ошибка множественного определения, включая заголовочный файл c ++ со встроенным кодом из нескольких источников

Внутри тела класс считается cxx встроенным компилятором. Если c++ вы реализуете вне тела, но cpp все еще в заголовке, вы должны c++ явно пометить метод как «встроенный».

namespace test_ns{

class TestClass{
public:
    inline void testMethod();
};

void TestClass::testMethod(){
    // some code here...
}

} // end namespace test_ns

Изменить

Мне cpp часто помогает решить подобные cxx проблемы компиляции, понимая, что c++ компилятор не видит ничего c++ похожего на файл заголовка. Заголовочные cxx файлы предварительно обрабатываются, и cpp компилятор просто видит один c++ огромный файл, содержащий c++ каждую строку из каждого cpp (рекурсивно) включенного cxx файла. Обычно отправной точкой cpp для этих рекурсивных включений cpp является компилируемый исходный c++ файл cpp. В нашей компании c++ даже скромный на вид файл cpp cpp может быть представлен cxx компилятору как 300000-строчный cpp монстр.

Таким образом, когда cxx метод, который не объявлен c++ встроенным, реализован в cpp файле заголовка, компилятор cpp может десятки раз увидеть c++ void TestClass :: testMethod() {...} в cxx предварительно обработанном cxx файле. Теперь вы можете видеть, что cpp это не имеет смысла, тот cxx же эффект, что и при многократном c++ копировании / вставке в один cpp исходный файл. И даже если cxx вам это удалось, имея его c++ только один раз в каждой cpp единице компиляции, с помощью cxx некоторой формы условной cxx компиляции (например, с использованием cxx скобок включения) компоновщик cxx все равно обнаружит, что cxx символ этого метода находится cpp в нескольких скомпилированных cpp единицах (объектных файлах).

c++

2022-05-25T02:44:35+00:00