Ошибка компоновщика в зависимости от того, где объявлен экземпляр - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть следующий заголовочный файл:

class LogisticActivationFunction
{
public:
    double evaluate(double x) const;
    double evaluate_derivative(double x) const;
};
LogisticActivationFunction logisticActivationFunction;

Затем я включаю его в main.cpp (и больше ничего не делаю) и получаю ошибку ld.Если я удаляю объявление LogisticActivationFunction logisticActivationFunction, я не получаю ошибку ld.

Действительно странная часть в том, что, если я добавлю еще один заголовочный файл с просто:

#include "logistic_activation_function.h"
LogisticActivationFunction logisticActivationFunction;

и включу его вместоон прекрасно компилируется, хотя способ работы заголовков должен быть полностью эквивалентен объявлению в другом заголовочном файле.

Есть идеи, что вызывает это?

1 Ответ

0 голосов
/ 25 февраля 2019

Определение переменной области имен в заголовке не очень хорошая идея.Если заголовок включен в более чем одну единицу перевода (что довольно типично для заголовка), тогда будет более одного определения, которое нарушает правила языка.

В заголовкеВы можете объявить переменную без определения, используя спецификатор связи extern.Затем вы можете определить переменную только в одном исходном файле.В качестве альтернативы, начиная с C ++ 17, вы можете объявить переменную inline, и в этом случае отдельное определение в исходном файле не требуется.

...