Ошибка компоновщика C ++ при использовании того же .h-файла в унаследованном классе

У меня есть два класса: ClassA и ClassB. ClassB наследует ClassA. Существует файл заголовка utility.h, включенный как в classa.cpp, так и в classb.cpp, так что я могу использовать метод

round(double number, int precision)

из utilities.h в обоих .cpp-файлах.

При использовании его в ClassA, как это:

double roundANumber(double number, int precision)
{
return Utilities::round(number, precision);
}

это работает отлично. Но когда я пытаюсь использовать его в ClassB, как это:

double roundAnotherNumber(double number, int precision)
{
return Utilities::round(number, precision);
}

компоновщик выдает мне ошибку:

error LNK2005: "double __cdecl Utilities::round(double,int)" (?
round@hUtilities@@YANNH@Z) already defined in classa.obj

и я не могу найти причину, почему это так.

Заранее спасибо.

Изменить: Добавлено, что Utilities.h содержит только это

 #include <cmath>

namespace MathUtilities {

double round(double number, int precision) {
int precisionFactor = std::pow(10, precision);
return std::round(number * precisionFactor) / precisionFactor;
}
}

1

Решение

Заголовки просто анализируются, как если бы они были включены напрямую. Таким образом, вы в конечном итоге дублируете определение функции.

Чтобы это исправить, используйте inline:

inline double round(double number, int precision) {...}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]