У меня есть два класса: 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;
}
}
Заголовки просто анализируются, как если бы они были включены напрямую. Таким образом, вы в конечном итоге дублируете определение функции.
Чтобы это исправить, используйте inline
:
inline double round(double number, int precision) {...}
Других решений пока нет …