I created a template class EWMA
in my project, but when using the class in my main.cpp
, I get an undefined reference to EWMA<int, 2>::EWMA(float)
Error. The .h and .cpp files of this class are inside lib/EWMA/
. The .h file looks as following:
#ifndef _EWMA_H
#define _EWMA_H
#include <Filter.h>
template<typename T, int dimensions = 1>
class EWMA : public Filter<T, dimensions> {
public:
EWMA(float alpha[dimensions]);
EWMA(float alpha = 0.2);
std::array<T, dimensions> addValue(T value[dimensions]);
private:
float alpha[dimensions];
T value[dimensions];
bool hasValue = false;
};
#endif
The .cpp file looks like this:
#include <EWMA.h>
template<typename T, int dimensions>
EWMA<T, dimensions>::EWMA(float alpha[dimensions]) {
this->alpha = alpha;
}
template<typename T, int dimensions>
EWMA<T, dimensions>::EWMA(float alpha) {
for (int i = 0; i < dimensions; i++) {
this->alpha[i] = alpha;
}
}
template<typename T, int dimensions>
std::array<T, dimensions> EWMA<T, dimensions>::addValue(T value[]) {
this->value = this->hasValue ? (1 - this->alpha) * this->value + this->alpha * value : value;
return this->value;
}
A very strong simplification of the main.cpp file is as following:
#include <EWMA.h>
EWMA<int, 3>* filter = new EWMA<int, 3>();
ā¦
Here I get the undefined reference to
EWMA<int, 3>::EWMA(float)ā` Error, indicating that the method might be declared, but not defined. When I move the content of EWMA.cpp to the .h file, everything compiles fine. Iām not even sure if that is a problem with PlatformIO or if I am missing something about C++ or something completely different.
Any help is much appreciated.
BTW, my other classes in the lib/
folder work just fine.