Я пытаюсь сделать систему, где мне нужна функция активатора. У этой функции-активатора может быть состояние, поэтому я попытался поместить состояние в concurrency::array_view. Когда я пытаюсь создать решение, я получаю следующую ошибку компоновщика.
Ошибка 2 ошибка LNK2019: неразрешенный внешний символ "public: static double __thiscall ArtNeuroNet::ActivationFunctions::Activator::function(double,class Concurrency::array_view) limited(cpu, amp)" (?function@Activator@ActivationFunctions@ArtNeuroNet@ @SENNV?$array_view@N$00@Concurrency@@@DZ_B) упоминается в функции _wmain D:\Projekte\ArtNeuroNet\ArtNeuroNet\ArtNeuroNet.obj ArtNeuroNet
Ошибка 3 ошибка LNK1120: 1 неразрешенные внешние файлы D:\Projekte\ArtNeuroNet\Debug\ArtNeuroNet.exe 1 1 ArtNeuroNet
Мой упрощенный активатор выглядит так
double Activator::lin_function(double x, concurrency::array_view<double, 1> state)
restrict(cpu, amp)
{
if (x > state[StateParameterType::ThresholdParameter])
return 1;
else if (x < -(state[StateParameterType::ThresholdParameter]))
return 0;
else
return state[StateParameterType::AlphaParameter] * x + 0.5f;
}
double* Activator::getInitialState(double alpha)
{
double stateCpu[] = {1.0, 0.5};
if (alpha != NULL)
stateCpu[0] = alpha;
return stateCpu;
}
Мое творение активатора выглядит так
Activator activator = *(new Activator());
double* stateCpu = activator.getInitialState(1.0);
concurrency::array_view<double, 1> state(2, stateCpu);
activator.lin_function(0.4, state);
В целях тестирования я добавил последнюю строку, которая представляет собой вызов activator.lin_function(0.4, state). Если я закомментирую эту строку, проект будет собран без проблем.
Мой вопрос в том, что я упускаю или делаю то, что на самом деле не должен делать?
ИЗМЕНИТЬ
Метод lin_function является приватным. Однако в активаторе есть функция публичного метода, которая вызывает приватный метод lin_function. По причинам упрощения я оставил эту часть исходного кода. Оба метода доступны, так как иначе я не смог бы построить решение, когда вызов метода lin_function закомментирован.
Активатор находится полностью внутри того же проекта, который пока является консольным приложением.
Функция lin_function использует одну переменную состояния. Однако пороговая реализация функции активатора вообще не нуждается в хранении состояния. Изменение всего на функцию активации порога и комментирование остального реагирует так же. В частности, это «lin_function закомментирована -> нет ошибки компоновщика, иначе -> ошибка компоновщика».
ИЗМЕНИТЬ 2
Для активатора существует заголовок (Activator.h) и исходный файл (Activator.cpp). Почему-то кажется, что компоновщик не может найти ни одного метода из заголовка, объявленного как restrict(cpu, amp).
// Doesn't get found and throws linker error
double Activator::function(double x)
restrict(cpu, amp)
{
return (x >= 0) ? 1 : 0;
}
// Get's found and no linker errors occur
double Activator::function(double x)
{
return (x >= 0) ? 1 : 0;
}
ИЗМЕНИТЬ 3
После определения всех методов, содержащих ограничения (amp, cpu) как статические в заголовочном файле, все строилось правильно и работало без проблем.
Существует ли ограничение на методы, которые должны быть статическими, когда используется ограничение (amp, cpu)?
Activator::getInitialState
вы возвращаете указатель на локальный. Не хорошая идея. - person Henrik   schedule 29.01.2014